Answers:
从ContainerAware(例如控制器)中:
$request = $this->container->get('request');
$routeName = $request->get('_route');
与树枝: {{ app.request.attributes.get('_route') }}
<body class="{{ app.request.get('_route') | replace({'_' : '-'}) }}">
应用特定于页面的CSS :)
我认为这是最简单的方法:
class MyController extends Controller
{
public function myAction($_route)
{
var_dump($_route);
}
.....
{% render "SomeBundle:SomeController:someAction" %}
,它不起作用,您将再次获得值“ _internal”。
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) { ... }
$route['_route']
似乎有问题,但可能不是symfony开发人员所谈论的。该食谱没有提及_route
的$router->match()
输出..
$router->match()
说“ @return array一个参数数组”似乎很内部。我不想依靠它,但是现在,它似乎是处理子请求时唯一可行的解决方案。
没有适用于所有用例的解决方案。如果使用$ request-> get('_ route')方法或其变体,则在发生转发的情况下它将返回'_internal'。
如果您需要即使转发也可以使用的解决方案,则必须使用2.4中提供的新RequestStack服务,但这会中断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();
$view['request']->getParameter('_route');
{% render... %}
呼叫standalone=true
。启用缓存(AppCache.php或具有ESI的清漆)后,这将导致使用单独的HTTP-Request(这是路由_internal
起作用的位置)来请求独立视图的顺序,以便可独立缓存。
在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 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 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 UPGRADE 而从容器获取,而是调用get('_ route')。
public function indexAction(Request $request)
{
$routeName = $request->get('_route');
}
如果要在树枝中获取路线名称,则必须像
{{ app.request.attributes.get('_route') }}
$request->get()
直接使用它,因为它很慢:github.com/symfony/http-foundation/blob/2.8/Request.php#L712