Wie sende ich var an den Ereignis-Listener in symfony2?

7

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.

    
pregmatch 03.12.2013, 10:56
quelle

3 Antworten

37

Ich sehe mehrere Möglichkeiten, damit umzugehen.

Hinzufügen einer globalen Variablen von einem 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%

Von einem 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

%Vor%

gibt ein Antwortobjekt , also wird kernel.view nicht aufgerufen.

Controller definieren

Die Idee ist, dass alle Controller ein Array von Daten zurückgeben, genau wie @Template Anforderungen.

%Vor%

Definieren des Dienstes

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

%Vor%

Erstellen des Dienstes

%Vor%

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.

Von einer TWIG-Erweiterung

Alternativ können Sie eine TWIG-Erweiterung erstellen . Im folgenden Beispiel nehme ich an, dass die MyListener -Definition die gleiche wie oben ist.

Definieren von Diensten

Gemäß der obigen Dokumentation müssen Sie nur eine einfache Erweiterungsklasse erstellen.

%Vor%

Definieren des Dienstes

Genau wie in der Dokumentation erstellen wir eine einfache Funktion.

%Vor%

Verwendung

Dann können Sie es in jeder Ansicht verwenden, indem Sie

tun %Vor%

Von einem gemeinsamen Controller

Ich mag diese Idee nicht, aber das ist eine Alternative. Sie müssen nur eine BaseController erstellen, die die Standardmethode render überschreibt.

%Vor%     
Touki 03.12.2013, 13:56
quelle
1

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 :

%Vor%

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.

    
Jimbo 23.03.2016 22:18
quelle
0

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.

Ссылка

    
Aurimas Ličkus 03.12.2013 11:16
quelle

Tags und Links