Ответ 1
-
Попробуйте очистить кеш.
-
Ваш маршрут настроен для обращения к контроллеру как к службе? Если нет, Symfony не будет использовать определение сервиса и, следовательно, любые аргументы, которые вы указали.
Вместо расширения стандартного контроллера я хотел бы вставить 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 }
Попробуйте очистить кеш.
Ваш маршрут настроен для обращения к контроллеру как к службе? Если нет, Symfony не будет использовать определение сервиса и, следовательно, любые аргументы, которые вы указали.
Прежде всего, давайте посмотрим, что доступно в вашем сервисном контейнере:
λ 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(
)
);
}
}