2012-04-24 4 views
13

Вместо расширения стандартного контроллера я хотел бы ввести Twig в один из моих классов.Injecting Twig как услуга в Symfony2

Контроллер:

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

, а затем в services.yml У меня есть следующие:

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

Ошибка я получаю это:

SomeController :: __ конструкт () должен быть экземпляром Twig_Environment, но не указан

Но я прохожу @twig через config. Я не вижу, что я делаю неправильно.

Edit:

Добавление правильный код - это то, что исправили проблему:

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

Это кажется довольно старый, но мне было интересно, как вам удалось зарегистрировать все Twig расширений, Сгенерированный код SF2 имеет -> addExtension, чтобы добавить их динамически. –

ответ

5
  1. Попробуйте очистить кэш.

  2. Ваш маршрут установлен до refer to the controller as a service? Если нет, Symfony не будет использовать определение сервиса и, следовательно, любые аргументы, которые вы указали.

+0

спасибо. это маршрут в routing.yml, который не ссылался на услугу. Обновлен вопрос с кодом от routing.yml – ed209

+0

, когда у вас есть доступ к контейнеру, вам просто просто $ this-> container-> get ('templating') -> render() – vodich

3

Прежде всего, давайте посмотрим на то, что доступно в контейнере службы:

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

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

Теперь мы бы, вероятно, пойти на класс TwigEngine (шаблонные услуги) вместо Twig_Enviroment (веточка службы). Вы можете найти шаблонный службу по vendor\symfony\symfony\src\Symfony\Bundle\TwigBundle\TwigEngine.php

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

В этом классе вы найдете два метода визуализации (..) и RenderResponse (...), что означает, что остальная часть кода должна работать хорошо с ниже примера. Вы также увидите, что TwigEngine вводит службу twig (класс Twig_Enviroment), чтобы построить его родительский класс BaseEngine. Поэтому нет необходимости запрашивать сервис твигов, и ваша ошибка требует, чтобы Twig_Environment исчезла.

Так что в вашем коде Вы бы сделать это так:

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

Ваш класс

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(

      ) 
     ); 
    } 
}