如何在Symfony 2中获取当前路线?
例如,routing.yml
:
somePage:
pattern: /page/
defaults: { _controller: "AcmeBundle:Test:index" }
如何获得此somePage
值?
答案 0 :(得分:310)
来自ContainerAware(如控制器):
$request = $this->container->get('request');
$routeName = $request->get('_route');
答案 1 :(得分:189)
使用Twig:{{ app.request.attributes.get('_route') }}
答案 2 :(得分:47)
我认为这是最简单的方法:
class MyController extends Controller
{
public function myAction($_route)
{
var_dump($_route);
}
.....
答案 3 :(得分:27)
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+。我开了bug,答案是“按设计”。如果您希望在子操作中获取路径,则必须将其作为参数传递
{{ render(controller('YourBundle:Menu:menu', { '_locale': app.request.locale, 'route': app.request.attributes.get('_route') } )) }}
你的控制器:
public function menuAction($route) { ... }
答案 4 :(得分:19)
没有适用于所有用例的解决方案。如果您使用$ request-> get(' _route')方法或其变体,对于发生转发的情况,它将返回' _internal'
如果您需要一个甚至可以转发的解决方案,您必须使用新的RequestStack服务,该服务已经到达2.4,但这将会中断ESI support :
$requestStack = $container->get('request_stack');
$masterRequest = $requestStack->getMasterRequest(); // this is the call that breaks ESI
if ($masterRequest) {
echo $masterRequest->attributes->get('_route');
}
如果你需要在模板中使用它,你可以制作一个枝条扩展名。
答案 5 :(得分:11)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul id="list1">
<li class="item">Object 1</li>
<li class="item">Object 2</li>
<li class="item">Object 3</li>
</ul>
<ul id="list2">
<li class="item">Object 1</li>
<li class="item">Object 2</li>
<li class="item">Object 3</li>
</ul>
不是要走的路,而且永远不是。根据创建Symfony的Fabien的说法It was always meant for debugging purposes。它是不可靠的,因为它不能用于转发和其他直接调用控制器之类的东西,如部分渲染。
您需要将路线的名称作为参数注入控制器see the doc here
此外,如果您不需要灵活性,请不要使用_route
,这比使用您需要的特定属性包(属性,查询或请求)慢得多,因此$request->get('');
情况下。
答案 6 :(得分:7)
$request->attributes->get('_route');
您可以从控制器中获取请求对象的路径名称。
答案 7 :(得分:4)
我从中获得的只是
_internal
我从$this->getRequest()->get('_route').
的控制器中获取路径名称
甚至代码tuxedo25建议返回_internal
此代码在Symfony 1.X中所谓的“组件”中执行;不是页面的控制器,而是需要一些逻辑的页面的一部分。
Symfony 1.X中的等效代码是:sfContext::getInstance()->getRouting()->getCurrentRouteName();
答案 8 :(得分:2)
使用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>
答案 9 :(得分:1)
根据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;
}
答案 10 :(得分:1)
对于任何需要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
?>
答案 11 :(得分:0)
使用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”打印到我的浏览器中所需的页面。
答案 12 :(得分:-2)
如果您想在控制器中获取路径名而不是注入请求(而不是从Symfony UPGRADE获取容器,而不是调用get('_ route')。
x <- is.na(a)
split(a[!x], cumsum(x)[!x])
如果你想在树枝上获得路线名称而不是像
那样得到它public function indexAction(Request $request)
{
$routeName = $request->get('_route');
}