2011-08-17 59 views

回答

274

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

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

@got一个switchwation为您检查http://meta.stackexchange.com/questions/155258/i-found-answers-for-a-question-not-really-correct-what-i-should -do –

+26

github.com/symfony/symfony/issues/854 request.attributes.get('_ route')不可靠,因为它仅用于调试目的(symfony dev说)并且在请求被转发时不起作用...请参阅超新星的答案,这些答案是有文件记录的,并且更加安全可靠 – luiges90

+3

当某件事被转发时,不工作的原因是因为您直接转发给控制器而不是路由。因此,Symfony不知道该用什么路线。通常情况下,你有一条路由到一个控制器,所以看起来很奇怪,除了“_internal”之外,它不能报告任何东西,但是可以创建与多个路由定义关联的通用控制器。当你考虑所有这些时,我认为这个“陷阱”更有意义。 – jzimmerman2011

4

所有我从得到的是 _internal

我从一个控制器内获取路线名称与$this->getRequest()->get('_route'). 连代码tuxedo25建议返回_internal

该代码在Symfony 1.X中被称为“组件”中执行;不是页面的控制器,而是需要逻辑的页面的一部分。

在Symfony的1.X的等效代码:sfContext::getInstance()->getRouting()->getCurrentRouteName();

+2

解决它自己。在视图中:'$ view ['request'] - > getParameter('_ route');' – alexismorin

+5

这是因为您正在使用'{%render ...%}'调用'standalone = true'。通过缓存(AppCache。PHP或清漆与ESI)启用这将导致独立的意见被请求与一个单独的HTTP请求(这是'_internal'路线进场),以便独立缓存。 –

183

随着嫩枝:{{ app.request.attributes.get('_route') }}

+7

谢谢!我正在使用''用于应用页面特定的css :) –

+9

github.com/symfony/symfony/issues/854 request.attributes.get('_ route')是不可靠的,因为它仅用于调试目的(symfony dev说),如果请求被转发则不工作...查看超新星的答案并且更安全 – luiges90

25

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) { ... } 
+0

https://github.com/symfony/symfony/issues/854我不确定这个,'$ route ['_ route']'似乎有问题,但可能不是symfony开发人员所谈论的。食谱没有提及'''router-> match()'输出的'_route' .. – luiges90

+0

我完全同意@ luiges90。 '$ router-> match()'的PHPDoc表示“@return array参数数组”,它似乎是_very_ internal。我不想依赖它,但现在,它似乎是处理子请求时唯一可行的解​​决方案。 – netmikey

44

我认为这是最简单的方法:

class MyController extends Controller 
{ 
    public function myAction($_route) 
    { 
     var_dump($_route); 
    } 

    ..... 
+2

您可以添加更多解释或显示示例输出以阐明如何解决问题? – Charlie

+7

@charlie http://symfony.com/doc/master/book/routing.html#route-parameters-and-controller-arguments – wdev

+1

@Charlie这是一个预定义的变量,它给你匹配的路线“名称” – supernova

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

您可以在控制器内得到请求对象的路径名。

17

没有适用于所有用例的解决方案。如果您使用$ 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'); 
} 

你可以做一个树枝延伸如果您在模板中需要它,则不需要。

+0

所以......您的解决方案如何不适用于所有使用案例? – greg0ire

+1

它打破了ESI,但它在任何情况下都能正常工作。 –

-1

,如果你想在你的控制器到达路线名字比你要注入的要求(而不是获取从容器由于Symfony UPGRADE,比调用get(“_路线”)。

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

在树枝获取路线名字比你要得到它像

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

不建议直接使用'''$ request-> get()''',因为它很慢:https://github.com/symfony/http-foundation/blob/2.8/Request.php#L712 –

9

_route根据法比安斯基是谁创造的Symfony是不是要走的路,绝不是It was always meant for debugging purposes,是unreliab因为它不适用于像转发和其他直接调用控制器,如局部渲染。

你需要注入路线的名称作为您的控制器参数,see the doc here

另外,请千万不要用$request->get('');如果你并不需要的灵活性,它比使用得到具体的属性包方式更慢,你在这种情况下需要(属性,查询或请求)如此$request->attributes->get('_route');

+1

好的,你基本上建议在这个文件中的每个路由添加额外的信息,而不是获取路由名称? ......这种思考和回应人们奋斗的理由,是越来越多人仇恨人们的原因之一。 – Charaf

+1

是的,尤其是如果你需要能够在线后面调用控制器本身(向前,部分渲染等),传递名称作为参数是唯一的方法,因为你根本就没有调用路由那种情况。至于_route意味着用于调试目的,不要把它带到我身上^^' –

+0

您也可以始终实现您自己的路由名称侦听器,或者一个简单的服务,具体取决于您通过添加一个请求侦听器解析URL以查找路由名称,但这对我来说似乎很重,并且仍然不能用于转发等等。 –

0

要获得(在前锋的情况下,更可靠)基于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; 
} 
2

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