Инжиниринг Twig как услуга в Symfony2

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

контроллер:

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 :: __ construct() должен быть экземпляром Twig_Environment, не указанным

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

Редактировать:

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

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

Ответ 1

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

  2. Ваш маршрут настроен для обращения к контроллеру как к службе? Если нет, Symfony не будет использовать определение сервиса и, следовательно, любые аргументы, которые вы указали.

Ответ 2

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

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

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

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

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

В этом классе вы найдете два метода render (..) и 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(

            )
        );
    }
}