如何在Symfony 2中获得当前路线?

如何获得Symfony 2中的当前路线?

例如, routing.yml

 somePage: pattern: /page/ defaults: { _controller: "AcmeBundle:Test:index" } 

我怎样才能得到这个somePage值?

从ContainerAware的东西(如控制器):

 $request = $this->container->get('request'); $routeName = $request->get('_route'); 

Twig: {{ 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+。 我打开了一个错误 ,答案是“按devise”。 如果您希望在子动作中获得路由,则必须将其作为parameter passing

 {{ render(controller('YourBundle:Menu:menu', { '_locale': app.request.locale, 'route': app.request.attributes.get('_route') } )) }} 

和你的控制器:

 public function menuAction($route) { ... } 

没有适用于所有用例的解决scheme。 如果使用$ request-> get('_ route')方法或其变体, 在发生转发的情况下将返回'_internal'

如果你需要一个即使在转发的情况下也能工作的解决scheme,你必须使用到达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'); } 

如果你需要在模板中,你可以做一个小枝的扩展。

 $request->attributes->get('_route'); 

您可以从控制器中的请求对象获取路由名称。

_route不是走的路,从来没有 。 根据创buildSymfony的Fabien, 它总是用于debugging目的 。 这是不可靠的,因为它不会像转发和其他直接调用像局部渲染控制器的东西。

您需要在您的控制器中注入路由名称作为参数, 请参阅此处的文档

另外,请不要使用$request->get(''); 如果你不需要灵活性,比使用你需要的特定属性包(属性,查询或请求)慢得多,所以$request->attributes->get('_route'); 在这种情况下。

我从中得到的是_internal

我从$this->getRequest()->get('_route').从控制器中获取路由名称$this->getRequest()->get('_route'). 即使代码tuxedo25build议返回_internal

这段代码是在Symfony 1.X中所谓的“Component”中执行的; 不是页面的控制器,而是需要逻辑的页面的一部分。

Symfony 1.X中的等价代码是: sfContext::getInstance()->getRouting()->getCurrentRouteName();

对于任何需要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 ?> 

使用Symfony 3.3,我已经使用这个方法并且工作正常。

我有4条路线

admin_category_index,admin_category_detail,admin_category_create,admin_category_update

只有一条线为所有路线创build一个主动类。

 <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 UPGRADE获取容器,而不是调用get('_ route')。

 public function indexAction(Request $request) { $routeName = $request->get('_route'); } 

如果你想得到的路线名称,树枝比你必须得到它

 {{ app.request.attributes.get('_route') }}