it-swarm.com.de

Wie erhalte ich die aktuelle Route in Symfony 2?

Wie erhalte ich die aktuelle Route in Symfony 2?

Beispielsweise, routing.yml:

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

Wie kann ich diesen somePage Wert erhalten?

215
IlyaDoroshin

Von etwas, das ContainerAware ist (wie ein Controller):

$request = $this->container->get('request');
$routeName = $request->get('_route');
312
tuxedo25

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

189
Matthieu

Ich denke, das ist der einfachste Weg, dies zu tun:

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

    .....
47
supernova

Symfony 2.0-2.1
Benutze das:

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

Dieser wird nicht Ihnen _internal Geben.

Update für Symfony 2.2 +: Das Starten von Symfony 2.2+ funktioniert nicht. Ich habe ein Bug geöffnet und die Antwort lautete "by design". Wenn Sie die Route in einer Unteraktion erhalten möchten, müssen Sie sie als Argument übergeben

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

Und dein Controller:

public function menuAction($route) { ... }
27
jsgoupil

Es gibt keine Lösung, die für alle Anwendungsfälle geeignet ist. Wenn Sie die Methode $ request-> get ('_ route') oder deren Varianten verwenden , wird für Fälle, in denen eine Weiterleitung stattgefunden hat, '_internal' zurückgegeben .

Wenn Sie eine Lösung benötigen, die auch mit der Weiterleitung funktioniert, müssen Sie den neuen RequestStack-Dienst verwenden, der in 2.4 enthalten ist. Dies wird jedoch nicht funktionieren ESI-Unterstützung:

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

Sie können eine twig Erweiterung daraus machen, wenn Sie es in Vorlagen benötigen.

19
K. Norbert

_route Ist nicht der richtige Weg und war nie . Es war immer für Debugging-Zwecke gedacht laut Fabien, der Symfony erstellt hat. Es ist unzuverlässig, da es nicht mit Dingen wie Weiterleiten und anderen direkten Aufrufen an Controller wie partiellem Rendern funktioniert.

Sie müssen den Namen Ihrer Route als Parameter in Ihre Steuerung einfügen, siehe Dokument hier

Verwenden Sie auch niemals $request->get('');, wenn Sie die Flexibilität nicht benötigen. Dies ist viel langsamer als die Verwendung von get für das spezifische Eigenschafts-Bag, das Sie benötigen (Attribute, Abfragen oder Anforderungen), also $request->attributes->get('_route'); in dieser Fall.

11
Tom Toms
$request->attributes->get('_route');

Sie können den Routennamen aus dem Anforderungsobjekt in der Steuerung abrufen.

7
Venkat Kotra

Alles was ich davon bekomme ist _internal

Ich erhalte den Routennamen aus einem Controller mit $this->getRequest()->get('_route'). Sogar der von tuxedo25 vorgeschlagene Code gibt _internal Zurück.

Dieser Code wird in einer Komponente ausgeführt, die in Symfony 1.X als "Komponente" bezeichnet wurde. Nicht der Controller einer Seite, sondern ein Teil einer Seite, die eine gewisse Logik benötigt.

Der entsprechende Code in Symfony 1.X lautet: sfContext::getInstance()->getRouting()->getCurrentRouteName();

4
alexismorin

Mit Symfony 3.3 habe ich diese Methode verwendet und funktioniert einwandfrei.

Ich habe 4 Routen wie

admin_category_index, admin_category_detail, admin_category_create, admin_category_update

Und nur eine Zeile macht eine aktive Klasse für alle Routen.

<li  {% if app.request.get('_route') starts with 'admin_category' %} class="active"{% endif %}>
 <a href="{{ path('admin_category_index') }}">Product Categoires</a>
</li>
2

So rufen Sie die aktuelle Route anhand der URL ab (zuverlässiger bei Weiterleitungen):

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
Alain Tiemblo

Für alle, die die aktuelle Route für Symfony 3 benötigen, verwende ich diese

<?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
?>
1
Aderemi Dayo

Mit Symfony 4.2.7 kann ich Folgendes in meine Vorlage twig) implementieren, die den benutzerdefinierten Routennamen anzeigt, den ich in meinen Controllern definiert habe.

In index.html.twig

<div class="col">
    {% set current_path =  app.request.get('_route') %}
    {{ current_path }}
</div>

In meinem Controller


    ...

    class ArticleController extends AbstractController {
        /**
         * @Route("/", name="article_list")
         * @Method({"GET"})
         */
        public function index() {
        ...
        }

        ...
     }

Das Ergebnis gibt "article_list" auf der gewünschten Seite in meinem Browser aus.

0
klewis