2013-10-11 4 views
14

Capisco che l'utilizzo di {% render() %} imponga automaticamente l'invio di un nuovo oggetto di richiesta, ma sono curioso se c'è un modo per passare la richiesta di origine come argomento?Symfony2: in Twig, passa la richiesta con la funzione Render

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

Questo non sembra di fare nulla per il controller:

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

Im assumendo la sua a causa del modo in cui il percorso è di impostazione:

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

mi immagino i dati come che non può ovviamente essere parte dell'URL, quindi un certo tipo di modo per passare i dati a un URL renderizzabile, qualcosa del tutto?

EDIT (Soluzione)

La soluzione è stata abbastanza semplice, a lungo termine, come Petre Patrasc seguito ha dimostrato, che in Ramoscello, tutto quello che dovevo fare era richiamare direttamente il controller, e con questo approccio Posso passare oggetti (come un oggetto Request) e array, invece di valori di testo in un URL.
Per eseguire approssimativamente la stessa idea in un controller, l'utilizzo del metodo forward() dal router consente effetti simili senza dover reindirizzare l'utente a un'altra pagina.

risposta

7

Se ho capito bene, siete alla ricerca di questo:

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

ho finalmente sono imbattuto mia risposta solo come hai postato questo haha ​​questo era il biglietto però! Non usare il router, basta invocare direttamente il controller – RedactedProfile

+0

Sono curioso, stai parlando di usare forward() o in altro modo? Sarebbe bello aggiornare la domanda originale con la tua soluzione, in quanto potrebbe essere un caso limite e aiutare qualcuno! –

+0

Twig lancia appena una richiesta di errore durante il tentativo di questo – skerit

7

utilizzare la funzione di rendering come risultato

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

e poi nel controllore

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

Interessante notare che il nome del parametro del metodo deve essere lo stesso, – skerit

-1

Dal Symfony 2.4 è possibile accedere alla richiesta originale tramite request_stack. Ciò evita la necessità di creare un nuovo parametro di metodo.

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

Utilizzare questa attenzione in quanto rende le sotto-richieste incompatibili con dell'ESIS/proxy inverso (in cui una sotto-richiesta è anche una richiesta del master) http://symfony.com/blog/new-in-symfony-2-4-the-request-stack

+0

Si prega di spiegare cosa c'è di sbagliato in questa risposta prima di votare, quindi posso approvarlo. – lookbadgers