如何在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') }}
- 如何在AngularJS中设置一个查询参数而不用做路由?
- Web API路由 – api / {controller} / {action} / {id}“function障碍”api / {controller} / {id}
- 是否有可能使一个基于子域的ASP.NET MVC路线?
- 从客户端(*)检测到潜在危险的Request.Path值
- 无法实例化模块未知提供者:$ routeProvider
- Rails / Rspec – 在控制器中testingredirect
- Laravel路线不工作?
- Angular2使用Hashtag路由到页面定位
- 如何在rspec中编写Rails 3.1引擎控制器testing?