Au lieu d'étendre le contrôleur standard, j'aimerais injecter Twig dans l'une de mes classes.
Contrôleur:
namespace Project\SomeBundle\Controller;
use Twig_Environment as Environment;
class SomeController
{
private $twig;
public function __construct( Environment $twig )
{
$this->twig = $twig;
}
public function indexAction()
{
return $this->twig->render(
'SomeBundle::template.html.twig', array()
);
}
}
puis dans services.yml
J'ai les informations suivantes:
project.controller.some:
class: Project\SomeBundle\Controller\SomeController
arguments: [ @twig ]
L'erreur que je reçois est:
SomeController :: __ construct () doit être une instance de Twig_Environment, aucune donnée
Mais je passe @twig
via config
. Je ne vois pas ce que je fais mal.
Modifier:
Ajouter le bon code - c'est ce qui a résolu le problème:
// in `routing.yml` refer to the service you defined in `services.yml`
project.controller.some
project_website_home:
pattern: /
defaults: { _controller: project.controller.some:index }
Essayez de vider votre cache.
Votre itinéraire est-il configuré pour référez-vous au contrôleur en tant que service ? Sinon, Symfony n'utilisera pas la définition de service, et donc les arguments que vous spécifiez.
Tout d'abord, regardons ce qui est disponible dans votre conteneur de service:
λ php bin/console debug:container | grep twig
twig Twig_Environment
...
λ php bin/console debug:container | grep templa
templating Symfony\Bundle\TwigBundle\TwigEngine
...
Maintenant, nous opterions probablement pour la classe TwigEngine (service de modèles) au lieu de Twig_Enviroment (service Twig). Vous pouvez trouver un service de modèles sous vendor\symfony\symfony\src\Symfony\Bundle\TwigBundle\TwigEngine.php
...
class TwigEngine extends BaseEngine implements EngineInterface
{
...
Dans cette classe, vous trouverez deux méthodes render (..) et renderResponse (...), ce qui signifie que le reste de votre code devrait fonctionner correctement avec l'exemple ci-dessous. Vous verrez également que TwigEngine injecte le service twig (classe Twig_Enviroment) pour le construire la classe parent BaseEngine. Par conséquent, il n'est pas nécessaire de demander le service twig et votre erreur de demande de Twig_Environment devrait disparaître.
Donc, dans votre code, vous feriez comme ceci:
# app/config/services.yml
services:
project.controller.some:
class: Project\SomeBundle\Controller\SomeController
arguments: ['@templating']
Ta classe
namespace Project\SomeBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Templating\EngineInterface;
use Symfony\Component\HttpFoundation\Response;
class SomeController
{
private $templating;
public function __construct(EngineInterface $templating)
{
$this->templating = $templating;
}
public function indexAction()
{
return $this->templating->render(
'SomeBundle::template.html.twig',
array(
)
);
}
}