如何在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
值?
从 ContainerAware 的东西(如控制器):
$request = $this->container->get('request');
$routeName = $request->get('_route');
用树枝:{{ app.request.attributes.get('_route') }}
我认为这是最简单的方法:
class MyController extends Controller
{
public function myAction($_route)
{
var_dump($_route);
}
.....
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');
}
如果你在模板中需要它,你可以用它来做一个树枝扩展。
_route
不是要走的路,从来没有。根据创建 Symfony 的 Fabien的说法,它总是用于调试目的。它不可靠,因为它不适用于转发和其他对控制器的直接调用(如部分渲染)。
您需要在控制器中注入您的路由名称作为参数,请参阅此处的文档
此外,$request->get('');
如果您不需要灵活性,请不要使用它比在您需要的特定属性包(属性、查询或请求)上使用 get 慢得多,所以$request->attributes->get('_route');
在这种情况下。
$request->attributes->get('_route');
您可以从控制器内的请求对象中获取路由名称。
我从中得到的只是
_internal
我从控制器内部获取路由名称,$this->getRequest()->get('_route').
即使代码 tuxedo25 建议返回_internal
这段代码在 Symfony 1.X 中被称为“组件”的地方执行;不是页面的控制器,而是需要一些逻辑的页面的一部分。
Symfony 1.X 中的等效代码是:sfContext::getInstance()->getRouting()->getCurrentRouteName();
使用 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>
根据 URL 获取当前路由(在转发的情况下更可靠):
public function getCurrentRoute(Request $request)
{
$pathInfo = $request->getPathInfo();
$routeParams = $this->router->match($pathInfo);
$routeName = $routeParams['_route'];
if (substr($routeName, 0, 1) === '_') {
return;
}
unset($routeParams['_route']);
$data = [
'name' => $routeName,
'params' => $routeParams,
];
return $data;
}
对于任何需要 Symfony 3 当前路线的人,这就是我使用的
<?php
$request = $this->container->get('router.request_context');
//Assuming you are on user registration page like https://www.yoursite.com/user/registration
$scheme = $request->getScheme(); //This will return https
$host = $request->getHost(); // This will return www.yoursite.com
$route = $request->getPathInfo(); // This will return user/registration(don't forget this is registrationAction in userController
$name = $request->get('_route'); // This will return the name.
?>
使用 Symfony 4.2.7,我可以在我的 twig 模板中实现以下内容,该模板显示了我在控制器中定义的自定义路由名称。
在 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 UPGRADE 而从容器获取,而不是调用 get('_route').
public function indexAction(Request $request)
{
$routeName = $request->get('_route');
}
如果您想在树枝中获取路线名称,则必须像这样
{{ app.request.attributes.get('_route') }}