How to get current route in Symfony 2?
Asked Answered
B

13

249

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?

Baeyer answered 17/8, 2011 at 16:51 Comment(0)
T
348

From something that is ContainerAware (like a controller):

$request = $this->container->get('request');
$routeName = $request->get('_route');
Twentyone answered 17/8, 2011 at 16:55 Comment(8)
@got a switchwation for you check meta.stackexchange.com/questions/155258/…Sodom
github.com/symfony/symfony/issues/854 request.attributes.get('_route') is not reliable because it is for debug purpose only (symfony dev said) and does not work if request is forwarded... see supernova's answer which are documented and are more fail-safeCerebrovascular
The reason for this not working when something is forwarded is due to the fact that you forward directly to a controller, not a route. As such, Symfony doesn't know what route that is for. Typically, you have one route to one controller, so it may seem weird that this can't report anything besides "_internal", however, it is possible to create general-purpose controllers that get associated with more than one route definition. When you consider all of this, I think this "gotcha" makes more sense.Wisner
@Twentyone Think about using RequestStack: symfony.com/blog/new-in-symfony-2-4-the-request-stackEat
$request->get('_route'); is slow ! $request->attributes->get('_route'); is better if you do not need the flexibilityDevious
More information here : roadtodev.com/comment-recuperer-la-route-actuelle-avec-symfonyOrdinary
@ThomasBredillet : The link is down.Publia
Since Symfony 4.3 this is officially documented method to get current route name: symfony.com/doc/4.3/…Shroyer
P
194

With Twig : {{ app.request.attributes.get('_route') }}

Pharmacy answered 6/1, 2012 at 9:34 Comment(2)
Thank you! Am using <body class="{{ app.request.get('_route') | replace({'_' : '-'}) }}"> for applying page-specific css :)Significs
github.com/symfony/symfony/issues/854 request.attributes.get('_route') is not reliable because it is for debug purpose only (symfony dev said) and does not work if request is forwarded... see supernova's answer which are documented and are more fail-safeCerebrovascular
L
48

I think this is the easiest way to do this:

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

    .....
Lincolnlincolnshire answered 8/8, 2012 at 15:51 Comment(5)
Can you add more explanation or show sample output to clarify how this solves the problem?Sesquicentennial
@charlie symfony.com/doc/master/book/…Transude
@Sesquicentennial It's a predefined variable which gives you the matched route "name"Lincolnlincolnshire
This is definitely the best answer to the original question. As a side note: it does not work, however, with sub-requests like {% render "SomeBundle:SomeController:someAction" %}, where you'll get the value '_internal' again.Frigate
A pity is that this works only in the original Action, for any other function it has to be forwarded.Timetable
F
29

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) { ... }
Fineberg answered 26/7, 2012 at 0:38 Comment(2)
github.com/symfony/symfony/issues/854 I am not sure about this, $route['_route'] seems problematic but might not be symfony dev talks about. The cookbook does not mention about _route of $router->match() output ..Cerebrovascular
I fully agree with @luiges90. The PHPDoc of $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
A
22

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.

Ascarid answered 17/3, 2014 at 14:2 Comment(1)
So… how does your solution not work for all uses-cases exactly?Whiz
D
11

_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.

Devious answered 30/12, 2016 at 8:16 Comment(3)
Ok, you basically suggest to add extra information to every routes in this files instead of getting the route name ? …Downs
Yep especially if you need to be able to call the controller itself later down the line (forwards, partial rendering, etc...) passing the name as a parameter is the only way here because you are not calling a route at all in that case. As for _route being meant for debug purposes don't take it out on me ^^'Devious
The doc link is broken. Nevertheless, the corresponding page for the symfony 5.3 version actually states that getting the _route is the way to go, actually: symfony.com/doc/5.3/…Shooter
P
10
$request->attributes->get('_route');

You can get the route name from the request object from within the controller.

Paule answered 1/10, 2013 at 9:46 Comment(0)
L
4

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();

Libre answered 15/10, 2011 at 10:28 Comment(2)
Solved it myself. In a view: $view['request']->getParameter('_route');Libre
this is because you are using {% 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
F
2

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.
?>
Feasible answered 8/4, 2017 at 14:40 Comment(3)
This will not return the name of the handled routeKynthia
@NicoHaase It is not rocket science, you are already having the request objectFeasible
This is answer is just wrong, i am wondering why it has upvotes. This is not the route!Plunder
W
2

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>
Wendish answered 4/6, 2017 at 17:46 Comment(0)
C
1

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;
}
Cyrillus answered 4/2, 2017 at 5:57 Comment(0)
J
0

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.

J answered 3/5, 2019 at 2:49 Comment(0)
O
-2

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') }}
Osier answered 25/4, 2016 at 21:12 Comment(1)
It is not recommended to use $request->get() directly because it's slow: github.com/symfony/http-foundation/blob/2.8/Request.php#L712Mirabelle

© 2022 - 2025 — McMap. All rights reserved.