2012-04-27 6 views
8

Hier finden Sie meine n -th Frage zu Symfony2.Wie bekomme ich zur Laufzeit den Namen der Route in Symfony2, wenn ich die Beschreibung der yaml-Routen verwende?

Ich arbeite mit einer pagination bundle, die den Namen der Route in der routing.yml Datei verwendet. Aus meiner Sicht ist dieser Ansatz nicht flexibel und führt zu einem schmutzigen Code, denn wenn ich den Namen der Route ändere, dann muss ich mir alle Twig Templates oder PHP Dateien ansehen, um den Routennamen zu aktualisieren. Dies ist in Ordnung für kleine Web-Anwendungen, wird aber einen solchen Fehler für größere Anwendungen liefern und auch eine hohe Belastung für den Entwickler bedeuten.

Also, ich frage mich, eine String-Variable x an die Pager Objekt übergeben durch das oben genannte Bündel übergeben. Die Zeichenfolge x sollte innerhalb der Steuerung initialisiert werden und den gewünschten Routennamen wie in der Datei routing.yml angegeben bereitstellen.

Lassen Sie mich ein Beispiel geben. Die Routing-Datei ist folgende:

//routing.yml 
AcmeTestBundle_listall: 
pattern: /test/page/{page} 
defaults: { _controller: AcmeTestBundle:List:listall, page: 1 } 
requirements: 
    page: \d+ 

Dann wird der damit verbundene Regler ist:

//use something.... 
class ListController extends Controller 
{ 

    public function exampleAction($page) 
    { 
    $array = range(1, 100); 
    $adapter = new ArrayAdapter($array); 
    $pager = new Pager($adapter, array('page' => $page, 'limit' => 25)); 

    return array('pager' => $pager); 
    } 
} 

Dann wird in dem Zweig Vorlage, die $pager den Routennamen erhält, die auf die oben Bündel beziehen

{% if pager.isPaginable %} 
    {{ paginate(pager, 'AcmeTestBundle_listall') }} 
{% endif %} 
{% for item in pager.getResults %} 
    <p>{{ item }}</p> 
{% endfor %} 

Haben Sie eine Idee, wie Sie den 'AcmeTestBundle_listall' String-Wert zur Laufzeit nur innerhalb des Controllers erhalten?

Antwort

30

Sie können die globale Variable app verwenden, die in Zweig verfügbar ist, um die aktuelle Route von der Anforderung abzurufen.

{% if pager.isPaginable %} 
    {{ paginate(pager, app.request.get('_route') }} 
{% endif %} 

Mehr über apphere und here.

+0

Sicher! Ich danke dir sehr! Schnelle und klare Antwort ... sehr geschätzt! – JeanValjean

+0

Wenn Sie dazu die Routenparameter benötigen, verwenden Sie app.request.get ('_ route_params'). –

+3

Symfony speichert den Routennamen als * Attribut * der Anforderung. Daher sollte er besser als solcher abgerufen werden: 'app .request.attributes.get ('_ route') '. Vermeiden Sie die Methode 'Request :: get()', weil sie zuerst versucht, den Parameter aus dem Abfrageparameter-Paket abzurufen - das Attribut bag wird nur als Fallback verwendet. Das heißt, mit 'Request :: get()' kann ein Benutzer '_route' überschreiben, indem er'? _route = my_tainted_param' an die URL anhängt. –

Verwandte Themen