24

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

2 回答 2

11

首先,让我们看看您的服务容器中可用的内容:

λ 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
{
...

在这个类中,您将找到两个方法 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(

            )
        );
    }
}
于 2016-08-13T22:03:56.053 回答
6
  1. 尝试清除缓存。

  2. 您的路由是否设置为将控制器称为服务?如果没有,Symfony 将不会使用服务定义,因此不会使用您指定的任何参数。

于 2012-04-24T19:46:37.387 回答