我需要在另一个中获取主要操作的路径,该路径已在模板中呈现。如何获得价值?
如果我尝试从$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这不是一个好方法。
答案 0 :(得分:0)
在Symfony 2.4发布之前,你所寻求的将是“不可能的”(它目前正在开发,目前还没有稳定版本)。
在Symfony2.4中,您将能够使用RequestStack。
然而,由于某种原因,我在不可能附近引用了引号,因为它是可行的,但它并不漂亮:
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 %}