2013-10-11 6 views
14

Ich verstehe, dass die Verwendung von automatisch erzwingt, ein neues Anfrageobjekt gesendet werden, aber ich bin neugierig, wenn es eine Möglichkeit gibt, die ursprüngliche Anfrage als Argument übergeben?Symfony2: in Twig, übergeben Anfrage mit Render-Funktion

{% render('some_action', {'originalRequest': app.request}) %} 

Dies scheint nicht, etwas für den Controller zu tun:

public function actionAction($originalRequest = null) 
{ 
    // $originalRequest ends up just being null 
} 

Im wegen der Art und Weise seiner Annahme, daß die Route Setup:

some_action: 
    pattern: /stuff/ 
    defaults: { _controller:SomeApp:Controller:action } 

Ich könnte mir vorstellen, Daten So etwas kann offensichtlich nicht Teil der URL sein, also eine Art, Daten an eine renderbare URL zu übergeben, überhaupt etwas?

EDIT (Lösung)

Die Lösung war ganz einfach auf lange Sicht, wie Petre Pătraşc unter Beweis gestellt hat, dass in Zweig, alles was ich brauchte die Steuerung direkt zu tun war berufen, und mit diesem Ansatz Ich kann Objekte (wie ein Request-Objekt) und Arrays anstelle von Textwerten in einer URL übergeben.
Um die gleiche Idee in einem Controller zu erfüllen, ermöglicht die Verwendung der forward()-Methode vom Router ähnliche Effekte, ohne dass der Benutzer auf eine andere Seite umgeleitet werden muss.

Antwort

7

Wenn ich richtig verstehe, sind Sie für diese suchen:

{% render "MyBundle:Controller:someAction" with { 'originalRequest' : app.request } %} 
+0

ich endlich über meine Antwort kam gerade Wie du das geschrieben hast haha, das war das Ticket! Nicht den Router verwenden, nur den Controller direkt aufrufen – RedactedProfile

+0

Ich bin neugierig, sprichst du über die Verwendung von forward() oder anders? Es wäre nett, die ursprüngliche Frage mit Ihrer Lösung zu aktualisieren, da es sich um einen Edge-Case handeln könnte und jemandem helfen könnte! –

+0

Twig wirft nur eine Fehleranforderung, wenn Sie dies versuchen – skerit

7

die Funktion als

public function exampleAction(Request $originalRequest) 
{ 
    // do something 
} 
+0

Interessant zu beachten, dass der Parametername der Methode identisch sein muss, auch – skerit

-1

in Ihrem Controller

{{ render(controller('MyBundle:ControllerName:example', {'originalRequest': app.request})) }} 

und dann

Ergebnis machen verwenden Seit Symfony 2.4 Sie können über den request_stack auf die ursprüngliche Anfrage zugreifen. Dies vermeidet die Notwendigkeit, einen neuen Methodenparameter zu erstellen.

function exampleAction() { 
    $request = $this->get('request_stack')->getMasterRequest(); 
    //do something 
} 

Gebrauch sorgfältig dies als es macht Ihre Unteranforderungen nicht kompatibel mit ESIs/Reverse-Proxys (wo eine Unteranfrage ist auch eine Anfrage Master) http://symfony.com/blog/new-in-symfony-2-4-the-request-stack

+0

Bitte erklären Sie, was mit dieser Antwort falsch ist, bevor Sie abstimmen, damit ich es genehmigen kann. – lookbadgers

Verwandte Themen