Ich versuche var zu senden, um vom Ereignis-Listener in symfony2 zu sehen, aber ich bin gestapelt.
1) Ist das möglich?
2) Welches Kernel-Event soll verwendet werden (kernel.view oder kernel.request)?
3) Wie schicke ich schließlich eine var an die Ansicht?
Meine beste Vermutung ist, dass ich die Rückgabe vom Controller verlängern muss und dann den Controller seine Arbeit machen lassen muss.
Ich muss ein Array von Objekten (Entitäten) senden.
Ich sehe mehrere Möglichkeiten, damit umzugehen.
kernel.request
Listener Die Idee ist, eine globale Variable direkt nach dem kernel.request
-Ereignis hinzuzufügen.
services.yml
%Vor%MyListener
%Vor%Sie können es jetzt jederzeit verwenden, indem Sie
ausführen %Vor%kernel.view
Listener Zuerst müssen Sie verstehen, wenn kernel.view
aufgerufen wird. Es wird nur aufgerufen, wenn die Rückkehr des Controllers kein ist Instanz des Antwortobjekts .
Das heißt, tun
gibt ein Antwortobjekt , also wird kernel.view
nicht aufgerufen.
Die Idee ist, dass alle Controller ein Array von Daten zurückgeben, genau wie @Template
Anforderungen.
Da Sie bereits Ihre Service-Definition haben, müssen Sie nur einige Anforderungen in Ihrer Service-Deklaration hinzufügen.
Sie benötigen den Dienst @templating
, um die Daten zu rendern.
Sie müssen sich selbst als kernel.view
Listener festlegen
Und da bist du. Der Listener erstellt eine neue Antwort und fügt Ihre benutzerdefinierte Definition von myvar
zu einer von ihm erstellten Vorlage hinzu.
Alternativ können Sie eine TWIG-Erweiterung erstellen . Im folgenden Beispiel nehme ich an, dass die MyListener
-Definition die gleiche wie oben ist.
Gemäß der obigen Dokumentation müssen Sie nur eine einfache Erweiterungsklasse erstellen.
%Vor%Genau wie in der Dokumentation erstellen wir eine einfache Funktion.
%Vor%Dann können Sie es in jeder Ansicht verwenden, indem Sie
tun %Vor% Ich mag diese Idee nicht, aber das ist eine Alternative. Sie müssen nur eine BaseController
erstellen, die die Standardmethode render
überschreibt.
Hier gibt es eine alternative Methode, die ich machen musste. Ich wollte einige Daten erhalten, führen Sie es durch json_encode()
, dann hinzufügen das als eine JavaScript-Variable auf die Antwort. Hier ist, was ich getan habe.
Ich abonniere kernel.response
:
Dies ist ein Weg es zu tun. Ehrlich gesagt, ich mag keine der auf dieser Seite beschriebenen Methoden. Es sollte einen besseren Weg geben, aber es gibt keinen besseren Weg. Dies ist, was ich benutze, und es funktioniert gut. Stellen Sie sicher, dass Sie Ihre Variable nicht "Daten" nennen; benutze etwas, das nicht woanders aufgegriffen wird, und schiebe es am besten in seinen eigenen (function() { }
JS-Namespace.
Ich weiß nicht, wie man Variablen direkt an die Anzeige übergibt, aber Sie können das Antwortobjekt mit kernel.response
event listener ändern. Schauen Sie sich an, wie Symfony Debug Toolbar den unteren Balken injiziert, Sie könnten eine ähnliche Technik verwenden.