如何在Symfony 2中获取当前路由?
例如routing.yml:
somePage:
pattern: /page/
defaults: { _controller: "AcmeBundle:Test:index" }
如何获得这个somePage值?
如何在Symfony 2中获取当前路由?
例如routing.yml:
somePage:
pattern: /page/
defaults: { _controller: "AcmeBundle:Test:index" }
如何获得这个somePage值?
当前回答
在Symfony 3.3中,我使用了这种方法,并且运行良好。
我有4条路线
Admin_category_index, admin_category_detail, admin_category_create, admin_category_update
只有一行为所有路由创建了一个活动类。
<li {% if app.request.get('_route') starts with 'admin_category' %} class="active"{% endif %}>
<a href="{{ path('admin_category_index') }}">Product Categoires</a>
</li>
其他回答
使用Symfony 4.2.7,我能够在我的树枝模板中实现以下内容,它显示了我在控制器中定义的自定义路由名。
在index.html.twig
<div class="col">
{% set current_path = app.request.get('_route') %}
{{ current_path }}
</div>
在控制器中
...
class ArticleController extends AbstractController {
/**
* @Route("/", name="article_list")
* @Method({"GET"})
*/
public function index() {
...
}
...
}
结果将“article_list”打印到浏览器中的所需页面。
Symfony 2.0 - -2.1 用这个:
$router = $this->get("router");
$route = $router->match($this->getRequest()->getPathInfo());
var_dump($route['_route']);
这个不会给你_internal。
针对Symfony 2.2+的更新:启动Symfony 2.2+时无法正常工作。我打开了一个漏洞,答案是“故意的”。如果希望在子操作中获取路由,则必须将其作为参数传入
{{ render(controller('YourBundle:Menu:menu', { '_locale': app.request.locale, 'route': app.request.attributes.get('_route') } )) }}
你的控制器:
public function menuAction($route) { ... }
不存在适用于所有用例的解决方案。如果您使用$request->get('_route')方法或其变体,它将返回'_internal'用于转发发生的情况。
如果你需要一个解决方案,即使转发,你必须使用新的RequestStack服务,在2.4到达,但这将打破ESI支持:
$requestStack = $container->get('request_stack');
$masterRequest = $requestStack->getMasterRequest(); // this is the call that breaks ESI
if ($masterRequest) {
echo $masterRequest->attributes->get('_route');
}
如果你在模板中需要它,你可以用它来做一个树枝扩展。
使用Twig: {{app.request.attributes.get('_route')}}
我从中得到的只是 _internal
我用$this->getRequest()->get('_route')从控制器内部获得路由名称。 甚至代码tuxedo25也建议返回_internal
这段代码是在Symfony 1.X中所谓的“组件”中执行的;不是页面的控制器,而是页面的一部分,需要一些逻辑。
Symfony 1中的等效代码。X是:sfContext::getInstance()->getRouting()->getCurrentRouteName();