2012-04-24 20 views
13

En lugar de extender el controlador estándar, me gustaría inyectar a Twig en una de mis clases.Inyectar Twig como un servicio en Symfony2

controlador:

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() 
     ); 
    } 
} 

y luego en services.yml Tengo el siguiente:

project.controller.some: 
    class: Project\SomeBundle\Controller\SomeController 
    arguments: [ @twig ] 

El error que estoy recibiendo es:

SomeController :: __ construct () debe ser una instancia de Twig_Environment, ninguno dado

Pero estoy pasando en @twig a través de config. No puedo ver lo que estoy haciendo mal.

Editar:

Añadiendo el código correcto - esto es lo que fija el problema:

// 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 } 
+0

Esto parece bastante viejo, pero me preguntaba cómo era usted capaz de registrar todas las extensiones Twig, la el código generado por SF2 tiene -> addExtension para agregar esos dinámicamente. –

Respuesta

5
  1. intentar borrar la memoria caché.

  2. ¿Su ruta está configurada en refer to the controller as a service? De lo contrario, Symfony no utilizará la definición del servicio y, por lo tanto, los argumentos que especifique.

+0

gracias. era la ruta en routing.yml que no se refería al servicio. Se actualizó la pregunta con el código de routing.yml – ed209

+0

cuando tienes acceso al contenedor se pone fácil solo $ this-> container-> get ('templating') -> render() – vodich

3

En primer lugar, echemos un vistazo a lo que está disponible en su contenedor de servicios:

λ php bin/console debug:container | grep twig 
    twig                 Twig_Environment 
    ... 

λ php bin/console debug:container | grep templa 
    templating               Symfony\Bundle\TwigBundle\TwigEngine 
    ... 

Ahora que probablemente vaya a clase TwigEngine (servicio de plantillas) en lugar de Twig_Enviroment (servicio de rama). puede encontrar el servicio de plantillas bajo vendor\symfony\symfony\src\Symfony\Bundle\TwigBundle\TwigEngine.php

... 
class TwigEngine extends BaseEngine implements EngineInterface 
{ 
... 

En esta clase se encuentran dos métodos hacen que (..) y renderResponse (...), lo que significa que el resto de su código debería funcionar bien con el a continuación ejemplo. También verá que TwigEngine inyecta el servicio twig (clase Twig_Enviroment) para construir su clase base BaseEngine. Por lo tanto, no es necesario solicitar el servicio de ramitas y su error al solicitar Twig_Environment debería desaparecer.

Así que en el código Se podría hacer esto de esta manera:

# app/config/services.yml 
services: 
    project.controller.some: 
     class: Project\SomeBundle\Controller\SomeController 
     arguments: ['@templating'] 

Su clase

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(

      ) 
     ); 
    } 
} 
Cuestiones relacionadas