Wie erhalte ich die aktuelle Route in Symfony 2?
Zum Beispiel routing.yml
:
somePage:
pattern: /page/
defaults: { _controller: "AcmeBundle:Test:index" }
Wie kann ich diesen somePage
Wert erhalten?
php
symfony
routing
symfony-routing
IlyaDoroshin
quelle
quelle
Mit Zweig:
{{ app.request.attributes.get('_route') }}
quelle
<body class="{{ app.request.get('_route') | replace({'_' : '-'}) }}">
Ich denke, das ist der einfachste Weg, dies zu tun:
quelle
{% render "SomeBundle:SomeController:someAction" %}
Unteranforderungen wie , bei denen Sie wieder den Wert '_internal' erhalten.Symfony 2.0-2.1
Verwenden Sie Folgendes :
Das wird dir nicht geben
_internal
.Update für Symfony 2.2+: Dies funktioniert nicht ab Symfony 2.2+. Ich habe einen Fehler geöffnet und die Antwort war "by design". Wenn Sie die Route in einer Unteraktion erhalten möchten, müssen Sie sie als Argument übergeben
Und dein Controller:
quelle
$route['_route']
scheint problematisch zu sein, spricht aber möglicherweise nicht über Symfony-Entwickler. Das Kochbuch nicht erwähnen ,_route
der$router->match()
Ausgang ..$router->match()
sagt "@return array Ein Array von Parametern", was sehr intern zu sein scheint . Ich möchte mich nicht darauf verlassen, aber im Moment scheint es die einzig praktikable Lösung zu sein, wenn es um Unteranfragen geht.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 in Fällen, in denen die 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 Version 2.4 verfügbar ist. Dadurch wird jedoch die ESI-Unterstützung unterbrochen :
Sie können daraus eine Zweigerweiterung erstellen, wenn Sie diese in Vorlagen benötigen.
quelle
_route
ist nicht der richtige Weg und war es auch nie . Laut Fabien, der Symfony erstellt hat, war es immer für Debugging-Zwecke gedacht . Es ist unzuverlässig, da es nicht mit Dingen wie Weiterleitung und anderen direkten Aufrufen an Controller wie partielles Rendern funktioniert.Sie müssen den Namen Ihrer Route als Parameter in Ihren Controller einfügen. Weitere Informationen finden Sie im Dokument hier
Verwenden
$request->get('');
Sie diese Option$request->attributes->get('_route');
in diesem Fall auch niemals, wenn Sie nicht die Flexibilität benötigen, die viel langsamer ist als die Verwendung von get für die von Ihnen benötigte Eigenschaftstasche (Attribute, Abfrage oder Anforderung) .quelle
Sie können den Routennamen vom Anforderungsobjekt aus dem Controller abrufen.
quelle
Alles was ich davon bekomme ist
_internal
Ich erhalte den
$this->getRequest()->get('_route').
Routennamen aus einem Controller mit sogar dem Code tuxedo25, der die Rückgabe vorschlägt_internal
Dieser Code wird in einer so genannten "Komponente" in Symfony 1.X ausgeführt. Nicht der Controller einer Seite, sondern Teil einer Seite, die etwas Logik benötigt.
Der entsprechende Code in Symfony 1.X lautet:
sfContext::getInstance()->getRouting()->getCurrentRouteName();
quelle
$view['request']->getParameter('_route');
{% render... %}
Anrufe mit verwendenstandalone=true
. Wenn das Caching (AppCache.php oder Lack mit ESI) aktiviert ist, werden die Standalone-Ansichten mit einer separaten HTTP-Anforderung (hier kommt die Route_internal
ins Spiel) angefordert, damit sie unabhängig zwischengespeichert werden können.Mit Symfony 3.3 habe ich diese Methode verwendet und funktioniert einwandfrei.
Ich habe 4 Routen wie
Und nur eine Zeile bildet eine aktive Klasse für alle Routen.
quelle
So ermitteln Sie die aktuelle Route anhand der URL (zuverlässiger bei Weiterleitungen):
quelle
Mit Symfony 4.2.7 kann ich Folgendes in meine Zweigvorlage implementieren, in der der benutzerdefinierte Routenname angezeigt wird, den ich in meinen Controllern definiert habe.
In index.html.twig
In meinem Controller
Das Ergebnis druckt "article_list" auf die gewünschte Seite in meinem Browser.
quelle
Für alle, die eine aktuelle Route für Symfony 3 benötigen, verwende ich diese
quelle
Wenn Sie den Routennamen in Ihrem Controller abrufen möchten, müssen Sie die Anforderung einfügen (anstatt aufgrund von Symfony UPGRADE aus dem Container zu gelangen und dann get ('_ route') aufzurufen.
Wenn Sie den Routennamen in einem Zweig erhalten möchten, müssen Sie ihn wie folgt erhalten
quelle
$request->get()
direkt zu verwenden, da es langsam ist: github.com/symfony/http-foundation/blob/2.8/Request.php#L712