Symfony2: Ändern der gerenderten Ansicht, die einen listener
Möchte ich zur Darstellung unterschiedlicher Ansichten in einem anderen Kontext in meinem Symfony2-Projekt.
Ich bin über mehrere Routen für das gleiche Taten, und ich möchte das Rendern einer anderen Seite (Ansicht), aber mit dem gleichen controller.
Ich habe zum Beispiel:
@Route("/articles/show", name="articles_show")
@Route("/mobile/articles/show", name="mobile_articles_show")
Beide Routen mit die gleiche Aktion : ArticlesController:showAction(), aber Rendern soll 2 verschiedene templates (für mobile Benutzer und Stammgäste sind).
show.html.twig
mobile.show.html.twig
Möchte ich nicht verwenden Sie eine if-Anweisung oder was auch immer in meinem controller, so dass ich erstellt ein listener (ähnlich einem preExecute-Funktion)
Ist hier ein Teil oder mein config.yml, die definiert meine Zuhörer
services:
controller.pre_execute_listener:
class: MyProject\MyBundle\Listener\ControllerListener
arguments: ["@security.context", "@doctrine", "@router", "@session"]
tags:- { name: kernel.event_listener, event: kernel.controller, method: preExecute }
Ich dachte an etwas wie, dass in den Hörer preExecute-Funktion:
if(substr($route,0,7) == 'mobile_'){
$view = 'mobile.'.$view;
}
Leider kann ich nicht einen Weg finden, wie $view oder die Aktualisierung der Ansicht "on-the-fly", kurz bevor Sie dargestellt werden.
Ich hoffe meine Frage ist klar genug, vielen Dank im vorraus, jede Idee ist willkommen 🙂
J.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist die Lösung:
Muss ich erst noch hören kernel.Ansicht, nicht kernel.controller.
Dann benutze ich die "@templating" Dienst (Dank an Marko Jovanovic für den Tipp)
So, hier ist meine neue config.yml:
Schließlich ist hier meine Zuhörer preExecute-Funktion
Hoffe, das hilft!
J.
Erwähnenswert: Die akzeptierte Lösung nicht funktionieren, wenn Sie direkt zurückgeben
Response
-Objekt (z.B. beim Aufruf$this->render()
), weil diekernel.view
Ereignis nicht ausgelöst wird, in diesem Fall:Konnte ich nicht herausfinden, einen Weg, um dieses, aber Sie fanden eine interessante Lösung für das gleiche problem:
Sie könnten einfach verlängern Zweig der render-engine wie die ZenstruckMobileBundle tut oder schreiben Sie Ihre eigenen Datei-locator wie die LiipThemeBundle.
[edit:] Alternativ könnte man auch überschreiben Sie die
TemplateNameParser
.Können Sie "@Template" - service als argument für die controller.pre_execute_listener.
Es scheint Ihr Gerät die Erkennung abgeschlossen ist, bevor Sie kommen, um Ihre route, so dass ich Wette, Sie erwarten, dass der mobile Anwender wird die Nutzung von mobile-Routen durch einige der Erkennung, bevor die Anforderung, dies scheint schmerzhaft zu behandeln, in jedem Vorlagen-und url-Generierung.
Kann besser sein, um zu erkennen, Gerät entweder vor oder später (Dank Categorizr oder einige schöne apache-Konfiguration), aber nicht unter Berufung auf die Strecke für die mobile Erkennung.
Integration von Categorizr mit so des aufrufenden templates Rendern wäre schön.
Dann mit ein nettes bundle für die Verwendung des richtigen templates/themes oder mit einer, in der weitere Allgemeine Funktionen