获取当前路线不是主要动作

时间:2013-12-03 19:48:43

标签: symfony

我需要在另一个中获取主要操作的路径,该路径已在模板中呈现。如何获得价值?

如果我尝试从$this->container->get('request')->get('_internal')$this->container->get('request')->get('_internal')获取路由,则它们为NULL。

目前,我只有一些像这样的解决方法

{% render(controller("DemBackendBundle:Default:changeWebsite", {
    'redirect': app.request.attributes.get('_route') 
})) %}

但我在这里阅读https://github.com/symfony/symfony/issues/854这不是一个好方法。

1 个答案:

答案 0 :(得分:0)

在Symfony 2.4发布之前,你所寻求的将是“不可能的”(它目前正在开发,目前还没有稳定版本)。

在Symfony2.4中,您将能够使用RequestStack

然而,由于某种原因,我在不可能附近引用了引号,因为它是可行的,但它并不漂亮:

  • 创建服务
  • 让它听取kernel.request事件
  • 在事件发生时定义为调用的方法中,您将获得GetResponseEvent作为参数。
  • 使用GetResponseEvent::getRequest方法获取对该请求的引用。
  • 检查请求是否为主请求:

        if (HttpKernel::MASTER_REQUEST != $event->getRequestType()) {
            // extract route
        }
    
  • 如果是,请提取路线

所以基本上你的服务应该是这样的:

<?php

namespace Acme\DemoBundle\EventListener;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\HttpKernel;

class AcmeRequestListener
{
    /**
     * @var string
     */
    private $route;

    public function onKernelRequest(GetResponseEvent $event)
    {
        if (HttpKernel::MASTER_REQUEST != $event->getRequestType()) {
            $this->route = $event->getRequest()->get('_route');
        }
    }
}

现在,因为我看到你的模板中需要路由名称,所以你可以扩展twig扩展名,当然也可以将其标记为twig扩展名:

<?php

namespace Acme\DemoBundle\EventListener;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\HttpKernel;

class AcmeRequestListener extends \Twig_Extension
{
    /**
     * @var string
     */
    private $route;

    public function onKernelRequest(GetResponseEvent $event)
    {
        if (HttpKernel::MASTER_REQUEST != $event->getRequestType()) {
            $this->route = $event->getRequest()->get('_route');
        }
    }

    public function getFunctions()
    {
         return [
             new \Twig_SimpleFunction('current_route', function () {
                 return $this->route;
             }),
         ];
    }
}

这段代码是不合适的,我还没有测试过,如果我拼错了一些类或函数名称,那就很抱歉:)

现在,您可以在模板中执行以下操作:

{% block something %}
    Hi, route of my master request is: {{ current_route() }}
{% endblock %}