web-dev-qa-db-fra.com

Injection de Twig en tant que service dans Symfony2

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 }
22
ed209
  1. Essayez de vider votre cache.

  2. 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.

6
simshaun

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(

            )
        );
    }
}
9
DevWL