Jak uzyskać bieżącą trasę w Symfony 2?

Jak uzyskać bieżącą trasę w Symfony 2?

Na przykład, routing.yml:

somePage:
   pattern: /page/
   defaults: { _controller: "AcmeBundle:Test:index" }

Jak mogę uzyskać tę wartość somePage?

Author: Moe Far, 2011-08-17

12 answers

Z czegoś co jest kontenerem (jak kontroler):

$request = $this->container->get('request');
$routeName = $request->get('_route');
 298
Author: tuxedo25,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-17 16:55:06

Z Gałązką: {{ app.request.attributes.get('_route') }}

 186
Author: Matthieu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-06 13:41:08

Myślę, że jest to najprostszy sposób, aby to zrobić:

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

    .....
 45
Author: supernova,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-08 15:51:59

Symfony 2.0-2.1
Użyj tego:

    $router = $this->get("router");
    $route = $router->match($this->getRequest()->getPathInfo());
    var_dump($route['_route']);

Ten da a nie da ci _internal.

Aktualizacja dla Symfony 2.2+: {[6] } to nie działa od początku Symfony 2.2+. Otworzyłem błąd i odpowiedź brzmiała "według projektu". Jeśli chcesz uzyskać trasę w pod-akcji, musisz przekazać ją jako argument

{{ render(controller('YourBundle:Menu:menu', { '_locale': app.request.locale, 'route': app.request.attributes.get('_route') } )) }}

I twój kontroler:

public function menuAction($route) { ... }
 26
Author: jsgoupil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-25 14:30:30

Nie ma rozwiązania, które sprawdziłoby się we wszystkich przypadkach użycia. Jeśli użyjesz metody $request - > get('_route') lub jej wariantów, zwróci ona '_internal' dla przypadków, w których miało miejsce przekierowanie.

Jeśli potrzebujesz rozwiązania, które działa nawet z przekierowaniem, musisz użyć nowej usługi RequestStack, która pojawiła się w 2.4, ale spowoduje to złamanie obsługi ESI:

$requestStack = $container->get('request_stack');
$masterRequest = $requestStack->getMasterRequest(); // this is the call that breaks ESI
if ($masterRequest) {
    echo $masterRequest->attributes->get('_route');
}

Możesz zrobić z tego rozszerzenie gałązki, jeśli potrzebujesz go w szablonach.

 18
Author: K. Norbert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-24 03:51:02

_route to nie jest droga i nigdy nie było . Według Fabiena, który stworzył Symfony, był on zawsze przeznaczony do debugowania. Jest zawodny, ponieważ nie będzie działał z takimi rzeczami jak przekazywanie i inne bezpośrednie wywołania do kontrolerów, takie jak częściowe renderowanie.

Musisz wprowadzić nazwę trasy jako parametr w kontrolerze, zobacz dokument tutaj

Również nigdy nie używaj $request->get(''); jeśli nie potrzebujesz elastyczności, jest to znacznie wolniejsze niż korzystanie z get na konkretnym worku właściwości, które potrzebujesz (atrybuty, zapytanie lub żądanie) Więc $request->attributes->get('_route'); w tym przypadku.

 10
Author: Tom Toms,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-01 23:06:47
$request->attributes->get('_route');

Nazwę trasy można pobrać z obiektu request z kontrolera.

 7
Author: Venkat Kotra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-01 09:46:54

/ Align = "left" / _internal

Nazwę trasy otrzymuję z kontrolera z $this->getRequest()->get('_route'). Nawet kod tuxedo25 sugeruje zwraca _internal

Ten kod jest wykonywany w tzw.' komponencie ' w Symfony 1.X; nie Kontroler strony, ale część strony, która wymaga trochę logiki.

Odpowiednik kodu w Symfony 1.X to: sfContext::getInstance()->getRouting()->getCurrentRouteName();

 4
Author: alexismorin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-15 10:28:32

Dla wszystkich, którzy potrzebują bieżącej trasy Symfony 3, to jest to, co używam

<?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
Author: Aderemi Dayo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-08 14:40:03

Z Symfony 3.3, użyłem tej metody i działa dobrze.

Mam 4 trasy jak

Admin_category_index, admin_category_detail, admin_category_create, admin_category_update

I tylko jedna linia tworzy klasę aktywną dla wszystkich tras.

<li  {% if app.request.get('_route') starts with 'admin_category' %} class="active"{% endif %}>
 <a href="{{ path('admin_category_index') }}">Product Categoires</a>
</li>
 2
Author: Muhammad Shahzad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-04 17:46:13

Aby uzyskać bieżącą trasę na podstawie adresu URL (bardziej wiarygodne w przypadku przekierowań):

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;
}
 1
Author: Alain Tiemblo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-04 05:57:48

Jeśli chcesz uzyskać nazwę trasy w kontrolerze, musisz wprowadzić żądanie (zamiast pobierać z kontenera z powodu Symfony UPGRADE i następnie wywołać get('_route').

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

Jeśli chcesz uzyskać nazwę trasy w gałązce, to musisz ją zdobyć jak

{{ app.request.attributes.get('_route') }}
 -1
Author: Vazgen Manukyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-25 21:12:38