如何获得Symfony 2中的当前路线?
如何获取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');
所有我从得到的是 _internal
我从一个控制器内获取路线名称与$this->getRequest()->get('_route').
连代码tuxedo25建议返回_internal
该代码在Symfony 1.X中被称为“组件”中执行;不是页面的控制器,而是需要逻辑的页面的一部分。
在Symfony的1.X的等效代码:sfContext::getInstance()->getRouting()->getCurrentRouteName();
解决它自己。在视图中:'$ view ['request'] - > getParameter('_ route');' – alexismorin
这是因为您正在使用'{%render ...%}'调用'standalone = true'。通过缓存(AppCache。PHP或清漆与ESI)启用这将导致独立的意见被请求与一个单独的HTTP请求(这是'_internal'路线进场),以便独立缓存。 –
随着嫩枝:{{ app.request.attributes.get('_route') }}
谢谢!我正在使用'
'用于应用页面特定的css :) –github.com/symfony/symfony/issues/854 request.attributes.get('_ route')是不可靠的,因为它仅用于调试目的(symfony dev说),如果请求被转发则不工作...查看超新星的答案并且更安全 – luiges90
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) { ... }
我认为这是最简单的方法:
class MyController extends Controller
{
public function myAction($_route)
{
var_dump($_route);
}
.....
$request->attributes->get('_route');
您可以在控制器内得到请求对象的路径名。
没有适用于所有用例的解决方案。如果您使用$ 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');
}
你可以做一个树枝延伸如果您在模板中需要它,则不需要。
所以......您的解决方案如何不适用于所有使用案例? – greg0ire
它打破了ESI,但它在任何情况下都能正常工作。 –
,如果你想在你的控制器到达路线名字比你要注入的要求(而不是获取从容器由于Symfony UPGRADE,比调用get(“_路线”)。
public function indexAction(Request $request)
{
$routeName = $request->get('_route');
}
如果你想
在树枝获取路线名字比你要得到它像
{{ app.request.attributes.get('_route') }}
不建议直接使用'''$ request-> get()''',因为它很慢:https://github.com/symfony/http-foundation/blob/2.8/Request.php#L712 –
_route
根据法比安斯基是谁创造的Symfony是不是要走的路,绝不是。It was always meant for debugging purposes,是unreliab因为它不适用于像转发和其他直接调用控制器,如局部渲染。
你需要注入路线的名称作为您的控制器参数,see the doc here
另外,请千万不要用$request->get('');
如果你并不需要的灵活性,它比使用得到具体的属性包方式更慢,你在这种情况下需要(属性,查询或请求)如此$request->attributes->get('_route');
。
好的,你基本上建议在这个文件中的每个路由添加额外的信息,而不是获取路由名称? ......这种思考和回应人们奋斗的理由,是越来越多人仇恨人们的原因之一。 – Charaf
是的,尤其是如果你需要能够在线后面调用控制器本身(向前,部分渲染等),传递名称作为参数是唯一的方法,因为你根本就没有调用路由那种情况。至于_route意味着用于调试目的,不要把它带到我身上^^' –
您也可以始终实现您自己的路由名称侦听器,或者一个简单的服务,具体取决于您通过添加一个请求侦听器解析URL以查找路由名称,但这对我来说似乎很重,并且仍然不能用于转发等等。 –
要获得(在前锋的情况下,更可靠)基于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
?>
随着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>
@got一个switchwation为您检查http://meta.stackexchange.com/questions/155258/i-found-answers-for-a-question-not-really-correct-what-i-should -do –
github.com/symfony/symfony/issues/854 request.attributes.get('_ route')不可靠,因为它仅用于调试目的(symfony dev说)并且在请求被转发时不起作用...请参阅超新星的答案,这些答案是有文件记录的,并且更加安全可靠 – luiges90
当某件事被转发时,不工作的原因是因为您直接转发给控制器而不是路由。因此,Symfony不知道该用什么路线。通常情况下,你有一条路由到一个控制器,所以看起来很奇怪,除了“_internal”之外,它不能报告任何东西,但是可以创建与多个路由定义关联的通用控制器。当你考虑所有这些时,我认为这个“陷阱”更有意义。 – jzimmerman2011