How do I get the current route in Symfony 2?
For example, routing.yml
:
somePage:
pattern: /page/
defaults: { _controller: "AcmeBundle:Test:index" }
How can I get this somePage
value?
How do I get the current route in Symfony 2?
For example, routing.yml
:
somePage:
pattern: /page/
defaults: { _controller: "AcmeBundle:Test:index" }
How can I get this somePage
value?
From something that is ContainerAware (like a controller):
$request = $this->container->get('request');
$routeName = $request->get('_route');
With Twig : {{ app.request.attributes.get('_route') }}
<body class="{{ app.request.get('_route') | replace({'_' : '-'}) }}">
for applying page-specific css :) –
Significs I think this is the easiest way to do this:
class MyController extends Controller
{
public function myAction($_route)
{
var_dump($_route);
}
.....
{% render "SomeBundle:SomeController:someAction" %}
, where you'll get the value '_internal' again. –
Frigate Symfony 2.0-2.1
Use this:
$router = $this->get("router");
$route = $router->match($this->getRequest()->getPathInfo());
var_dump($route['_route']);
That one will not give you _internal
.
Update for Symfony 2.2+: This is not working starting Symfony 2.2+. I opened a bug and the answer was "by design". If you wish to get the route in a sub-action, you must pass it in as an argument
{{ render(controller('YourBundle:Menu:menu', { '_locale': app.request.locale, 'route': app.request.attributes.get('_route') } )) }}
And your controller:
public function menuAction($route) { ... }
$route['_route']
seems problematic but might not be symfony dev talks about. The cookbook does not mention about _route
of $router->match()
output .. –
Cerebrovascular $router->match()
says "@return array An array of parameters" which seems very internal. I don't want to rely on it, but right now, it seems to be the only viable solution when dealing with sub-requests. –
Frigate There is no solution that works for all use cases. If you use the $request->get('_route') method, or its variants, it will return '_internal' for cases where forwarding took place.
If you need a solution that works even with forwarding, you have to use the new RequestStack service, that arrived in 2.4, but this will break ESI support:
$requestStack = $container->get('request_stack');
$masterRequest = $requestStack->getMasterRequest(); // this is the call that breaks ESI
if ($masterRequest) {
echo $masterRequest->attributes->get('_route');
}
You can make a twig extension out of this if you need it in templates.
_route
is not the way to go and never was. It was always meant for debugging purposes according to Fabien who created Symfony. It is unreliable as it will not work with things like forwarding and other direct calls to controllers like partial rendering.
You need to inject your route's name as a parameter in your controller, see the doc here
Also, please never use $request->get('');
if you do not need the flexibility it is way slower than using get on the specific property bag that you need (attributes, query or request) so $request->attributes->get('_route');
in this case.
_route
is the way to go, actually: symfony.com/doc/5.3/… –
Shooter $request->attributes->get('_route');
You can get the route name from the request object from within the controller.
All I'm getting from that is
_internal
I get the route name from inside a controller with $this->getRequest()->get('_route').
Even the code tuxedo25 suggested returns _internal
This code is executed in what was called a 'Component' in Symfony 1.X; Not a page's controller but part of a page which needs some logic.
The equivalent code in Symfony 1.X is: sfContext::getInstance()->getRouting()->getCurrentRouteName();
$view['request']->getParameter('_route');
–
Libre {% render... %}
calls with standalone=true
. With caching (AppCache.php or varnish with ESI) enabled this will cause the standalone views to be requested with a seperate HTTP-Request (this is where the route _internal
comes into play) in order ro be independently cacheable. –
Kashgar For anybody that need current route for Symfony 3, this is what I use
<?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
$name = $request->get('_route'); // This will return the name.
?>
With Symfony 3.3, I have used this method and working fine.
I have 4 routes like
admin_category_index, admin_category_detail, admin_category_create, admin_category_update
And just one line make an active class for all routes.
<li {% if app.request.get('_route') starts with 'admin_category' %} class="active"{% endif %}>
<a href="{{ path('admin_category_index') }}">Product Categoires</a>
</li>
To get the current route based on the URL (more reliable in case of forwards):
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;
}
With Symfony 4.2.7, I'm able to implement the following in my twig template, which displays the custom route name I defined in my controller(s).
In index.html.twig
<div class="col">
{% set current_path = app.request.get('_route') %}
{{ current_path }}
</div>
In my controller
...
class ArticleController extends AbstractController {
/**
* @Route("/", name="article_list")
* @Method({"GET"})
*/
public function index() {
...
}
...
}
The result prints out "article_list" to the desired page in my browser.
if you want to get route name in your controller than you have to inject the request (instead of getting from container due to Symfony UPGRADE and than call get('_route').
public function indexAction(Request $request)
{
$routeName = $request->get('_route');
}
if you want to get route name in twig than you have to get it like
{{ app.request.attributes.get('_route') }}
$request->get()
directly because it's slow: github.com/symfony/http-foundation/blob/2.8/Request.php#L712 –
Mirabelle © 2022 - 2025 — McMap. All rights reserved.