我不想扩展标准控制器,而是将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 }
答案 0 :(得分:6)
尝试清除缓存。
您的路线是否设置为refer to the controller as a service?如果没有,Symfony将不会使用服务定义,因此也不会使用您指定的任何参数。
答案 1 :(得分:4)
首先,让我们看一下服务容器中可用的内容:
λ 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(twig服务)。
您可以在vendor\symfony\symfony\src\Symfony\Bundle\TwigBundle\TwigEngine.php
...
class TwigEngine extends BaseEngine implements EngineInterface
{
...
在这个类中,你会发现两个方法render(..)和 renderResponse(...),这意味着你的代码的其余部分应该可以正常使用下面的例子。您还将看到TwigEngine注入twig服务(Twig_Enviroment类)来构建它的父类BaseEngine。因此,没有必要请求twig服务,并且您的错误请求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(
)
);
}
}