2012-04-24 13 views
13

Zamiast rozszerzać standardowy kontroler, chciałbym wstrzyknąć Twig w jedną z moich klas.Wstrzykiwanie gałązki jako usługi w Symfony2

Kontroler:

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

a następnie w services.yml mam następujące:

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

Błąd Dostaję jest:

SomeController :: __ konstrukt () musi być instancją Twig_Environment, żadna podana

Ale przechodzę w @twig przez config. Nie widzę, co robię źle.

Edit:

Dodawanie prawidłowy kod - to co rozwiązaniu problemu:

// 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

To wydaje się dość stary, ale zastanawiałem się, w jaki sposób udało ci się zarejestrować wszystkie gałązka modyfikacji, wygenerowany kod przez SF2 ma -> addExtension, aby dodać je dynamicznie. –

Odpowiedz

5
  1. spróbuj wyczyścić pamięć podręczną.

  2. Czy Twoja trasa została skonfigurowana na refer to the controller as a service? Jeśli nie, Symfony nie użyje definicji usługi, a zatem żadnych określonych argumentów.

+0

dzięki. to była trasa w routing.yml, która nie odnosiła się do usługi. Zaktualizowałeś pytanie za pomocą kodu z routing.yml – ed209

+0

, gdy masz dostęp do kontenera, to staje się łatwe tylko $ this-> container-> get ('templating') -> render() – vodich

3

Przede wszystkim, pozwala spojrzeć na to, co jest dostępne w danym pojemniku usług:

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

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

Teraz będziemy prawdopodobnie iść do klasy TwigEngine (usługa szablonów) zamiast Twig_Enviroment (usługa gałązka). można znaleźć usługę szablonów pod vendor\symfony\symfony\src\Symfony\Bundle\TwigBundle\TwigEngine.php

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

w tej klasie znajdą Państwo dwie metody render (..) i renderResponse (...), co oznacza, że ​​reszta kodu powinny działać prawidłowo z poniżej przykład. Zobaczysz również, że TwigEngine wstrzykuje usługę twig (klasa Twig_Enviroment), aby skonstruować ją jako klasę rodzicielską BaseEngine. Nie ma więc potrzeby żądania usługi gałązkowej i Twój błąd żądania Twig_Environment powinien zniknąć.

Więc w kodzie by to zrobić tak:

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

Twoja klasa

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(

      ) 
     ); 
    } 
} 
Powiązane problemy