Symfony 2.3:在渲染控制器的请求对象中缺少_controller属性

时间:2014-02-14 08:44:45

标签: symfony request twig symfony-2.3

我有一个自定义的TemplatingProvider服务,我在控制器中使用它来输出视图。

namespace Acme\FrontEndBundle\Templating;

class TemplatingProvider
{
    private $templating;
    private $request;

    function __construct($templating, $request)
    {
        $this->templating = $templating;
        $this->request = $request;
    }

    function getTemplate($name)
    {
        $controller = $this->request->attributes->get('_controller');
        preg_match('/Controller\\\([a-zA-Z]*)Controller/', $controller, $matches);
        $controller = 'AcmeFrontEndBundle:' . $matches[1] . ':';
        $template = $controller . $name;
        // ...

在普通请求中,这可以正常工作,但不能在子请求上工作,例如在我使用twigs render(controller(...))函数在模板中渲染控制器时。 似乎$this->request->attributes->get('_controller')NULL。我理解为_route,因为控制器不是通过一个访问的,但为什么_controller没有设置,我怎么能绕过它?

我知道在树枝上使用render(path(...))可以解决这个问题,但对我来说这不是一个选择,我真的需要render(controller(...))

提前感谢任何建议。

更新

感谢Vadim Ashikhmans的回答,我找到了解决方案:

`@service_container注入服务,然后使用容器获取请求,并在那里获得请求。但是我在辅助函数中解决了一个小障碍:

function getController()
{
    $controller = $this->container->get('request')->get('_controller');

    // on mainrequest (calling the controller through its route)
    // $controller follows the namespacelike schema: Vendor\Bundle\Controller\ControllerController:actionAction
    preg_match('/Controller\\\([a-zA-Z]*)Controller/', $controller, $matches);
    if (isset($matches[1]))
    {
        $controller = 'AcmeFrontEndBundle:' . $matches[1] . ':';
    }
    else
    {
        // on subrequests (e.g. render(controller(...)) in a template)
        // $controller looks like Bundle:Controller:action
        preg_match('/:([a-zA-Z]*):/', $controller, $matches);
        $controller = 'AcmeFrontEndBundle:' . $matches[1] . ':';
    }

    return $controller;
}

非常感谢你! :)

1 个答案:

答案 0 :(得分:1)

我认为_controller属性为空,因为对于每个子请求,当前请求对象都是重复的,因此在子请求中,TemplateProvider会尝试对旧数据进行操作。

您可以尝试将容器传递给TemplateProvider构造函数,并在getTemplate方法中检索请求对象。