Symfony2,如果控制器具有构造函数,如何在树枝模板中呈现控制器的动作
Symfony2, how to render controller's action in a twig template if controller has a constructor
从官方文档 (http://symfony.com/doc/current/quick_tour/the_view.html#embedding-other-controllers) 我学会了如何在 Twig 模板中嵌入控制器。
问题出现在Controller注入属性的时候。有没有办法将 Twig 的 render(controller())
函数与具有构造函数的控制器一起使用?
当我尝试以下操作时:
{{ render(controller(
'SomeBundle:Some:renderList',
{ 'request': app.request }
)) }}
我收到这个错误:
Missing argument 1 for SomeBundle\Controller\SomeController::__construct()
此控制器的构造函数如下所示:
public function __construct($container, SomeService $someService) {
parent::__construct($container);
$this->someService = $someService;
}
容器和someService的注入在service.yml中配置。
那么,我的问题是:当这个控制器使用依赖注入时,如何将控制器嵌入到 Twig 的模板中?
更新
我可以这样做:
{{ render(app.request.baseUrl ~ '/some/route') }}
但我想避免制作路线。
更新 2
来自 service.yml
的服务定义
some.controller:
class: SomeBundle\Controller\SomeController
arguments: ["@service_container", "@some.service"]
如果您已将控制器定义为服务,则需要将其"inject" 放入 twig 中以使其可用并正确实例化。
我建议创建 twig 全局变量
#app/config/config.yml
twig:
globals:
cc: "@comparison.controller"
那么您可以使用其中一种方法(动作?)
{{ cc.foo(aBarVariable) }}
备选答案
您可以创建一个 twig extension,您可以在其中注入您的服务以使其可供查看
对于控制器即服务,您只需使用服务名称 (@some.controller
) 和操作 (yourAction
) 而不是控制器快捷方式 (SomeBundle:Some:renderList
),如您在Sylius templates.
所以会是...
{{ render(controller('some.controller:yourAction')) }}
如果你是 Symfony 2.4+,你可以使用 request_stack
来获取请求,而不是像..
这样的参数传递它
$request = $this->container->get('request_stack')->getMasterRequest();
从官方文档 (http://symfony.com/doc/current/quick_tour/the_view.html#embedding-other-controllers) 我学会了如何在 Twig 模板中嵌入控制器。
问题出现在Controller注入属性的时候。有没有办法将 Twig 的 render(controller())
函数与具有构造函数的控制器一起使用?
当我尝试以下操作时:
{{ render(controller(
'SomeBundle:Some:renderList',
{ 'request': app.request }
)) }}
我收到这个错误:
Missing argument 1 for SomeBundle\Controller\SomeController::__construct()
此控制器的构造函数如下所示:
public function __construct($container, SomeService $someService) {
parent::__construct($container);
$this->someService = $someService;
}
容器和someService的注入在service.yml中配置。
那么,我的问题是:当这个控制器使用依赖注入时,如何将控制器嵌入到 Twig 的模板中?
更新
我可以这样做:
{{ render(app.request.baseUrl ~ '/some/route') }}
但我想避免制作路线。
更新 2
来自 service.yml
的服务定义some.controller:
class: SomeBundle\Controller\SomeController
arguments: ["@service_container", "@some.service"]
如果您已将控制器定义为服务,则需要将其"inject" 放入 twig 中以使其可用并正确实例化。
我建议创建 twig 全局变量
#app/config/config.yml
twig:
globals:
cc: "@comparison.controller"
那么您可以使用其中一种方法(动作?)
{{ cc.foo(aBarVariable) }}
备选答案
您可以创建一个 twig extension,您可以在其中注入您的服务以使其可供查看
对于控制器即服务,您只需使用服务名称 (@some.controller
) 和操作 (yourAction
) 而不是控制器快捷方式 (SomeBundle:Some:renderList
),如您在Sylius templates.
所以会是...
{{ render(controller('some.controller:yourAction')) }}
如果你是 Symfony 2.4+,你可以使用 request_stack
来获取请求,而不是像..
$request = $this->container->get('request_stack')->getMasterRequest();