在Symfony2中注入Twig作为服务

时间:2012-04-24 19:10:36

标签: symfony dependency-injection

我不想扩展标准控制器,而是将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 }

2 个答案:

答案 0 :(得分:6)

  1. 尝试清除缓存。

  2. 您的路线是否设置为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(

            )
        );
    }
}