Symfony2,如果控制器有一个构造函数,如何在树枝模板中呈现控制器的动作

gre*_*reg 5 dependency-injection symfony twig

从官方文档(http://symfony.com/doc/current/quick_tour/the_view.html#embedding-other-controllers)我学习了如何在Twig模板中嵌入Controller.

Controller注入属性时出现问题.有没有办法使用render(controller())具有构造函数的控制器的Twig 函数?

当我尝试以下时:

{{ render(controller(
  'SomeBundle:Some:renderList',
  { 'request': app.request }
)) }}
Run Code Online (Sandbox Code Playgroud)

我收到此错误: Missing argument 1 for SomeBundle\Controller\SomeController::__construct()

此Controller的构造函数如下所示:

public function __construct($container, SomeService $someService) {
  parent::__construct($container);
  $this->someService = $someService;
}
Run Code Online (Sandbox Code Playgroud)

注入容器和someService在service.yml中配置.

所以,我的问题是:当控制器使用依赖注入时,如何在Twig的模板中嵌入控制器?

UPDATE

我可以这样做: {{ render(app.request.baseUrl ~ '/some/route') }} 但我想避免制作路线.

更新2

service.yml的服务定义

some.controller:
    class: SomeBundle\Controller\SomeController
    arguments: ["@service_container", "@some.service"]
Run Code Online (Sandbox Code Playgroud)

Don*_*sto 5

如果您已将控制器定义为服务,则需要将其"注入"树枝以使其可用并正确实例化.

我建议创建twig全局变量

#app/config/config.yml
twig:
    globals:
        cc: "@comparison.controller"
Run Code Online (Sandbox Code Playgroud)

然后你可以使用其中一种方法(动作?)

{{ cc.foo(aBarVariable) }}
Run Code Online (Sandbox Code Playgroud)

替代答案

您可以创建一个枝条扩展,您可以在其中注入您的服务,以使其可用于视图


qoo*_*mao 3

对于控制器即服务,您只需使用服务名称 ( @some.controller) 和操作 ( ),而不是像Sylius 模板中所见的yourAction控制器快捷方式 ( ) 。SomeBundle:Some:renderList

所以这会是...

{{ render(controller('some.controller:yourAction')) }}
Run Code Online (Sandbox Code Playgroud)

如果您是 Symfony 2.4+,您可以使用 来request_stack获取请求,而不是像这样将其作为参数传递。

$request = $this->container->get('request_stack')->getMasterRequest();
Run Code Online (Sandbox Code Playgroud)