2012-01-03 18 views
11

È possibile inoltrare una richiesta, passando tutti i parametri GET/POST?Symfony 2 Inoltra Richiesta di passare i parametri GET/POST

penso che se io faccio solo

$this->forward('dest') 

andrò a dest senza params GET/POST?

UPDATE

mio obiettivo è in realtà per avere un'azione di controllo come addSomething che prende i controlli che l'utente ha le "voci" sufficienti per aggiungere qualcosa. Quindi inoltrare la richiesta al controller appropriato per continuare l'aggiunta effettiva dell'aggiunta di {Type} Something

Oppure ottenere un servizio di "verifica" in tutti i controller che effettua il controllo più appropriato? In ogni modo, credo che la sua informativa di sapere come di trasmettere ad un'azione di controllo con I parametri sono tutti

risposta

15

non vedo alcuna ragione qui per inoltrare la richiesta di nuovo attraverso il kernel. Puoi seguire la strada dell'incapsulamento di questa logica in un servizio di controllo, come suggerito, oppure potresti creare un listener kernel.request che viene eseguito dopo il listener del router e applica l'attributo _controller solo se le tue condizioni sono soddisfatte.

Ad esempio, questo routing.yml:

some_route: 
    pattern: /xyz 
    defaults: { _controller_candidate: "FooBundle:Bar:baz" } 

E questo ascoltatore:

class MyListener 
{ 
    public function onKernelRequest($event) 
    { 
     $request = $event->getRequest(); 
     if (!$controller = $request->attributes->get('_controller_candidiate')) { 
      return; 
     } 

     if (/* your logic... */) { 
      $request->attributes->set('_controller', $controller'); 
     } 
    } 
} 

configurato per eseguire dopo l'ascoltatore core router:

services: 
    my_listener: 
     class: MyListener 
     tags: 
      - 
       name:  kernel.event_listener 
       event: kernel.request 
       priority: -10 

La priorità del il listener del core router è 0 in Symfony 2.0 e 32 in Symfony 2.1. In entrambi i casi, una priorità di -10 dovrebbe funzionare.

Sono curioso di vedere se questo funziona :)

+0

Sembra che funzioni. Aggiornerà se funziona dopo che ci provo più tardi. Se voglio fare il contrario, eseguire qualcosa dopo un'azione del controller, c'è un evento simile? Come fai a scoprire questi metodi apparentemente non documentati? –

+0

Ok, ho trovato la mia risposta http://symfony.com/doc/2.0/book/internals.html#handling-requests. Mi chiedo quale sia il metodo giusto da usare? 'Kernel.response'? –

+0

Oh, io uso l'annotazione '@ Route', come posso modificare' $ request-> attributes-> get ('_ controller_candidiate') '? –

27

soluzione più semplice (e uno probabilmente sarei andare per) potrebbe essere quella di passare proprio Richiesta di classe come parametro avanti

public function indexAction() 
{ 
    $request = $this->getRequest(); 

    return $this->forward('AcmeBundle:Forward:new', array('request' => $request)); 
} 

E in azione inoltrato basta usare come metodo param:

public function testAction($request) 
{ 
    var_dump($request);exit; 
} 
+4

MA ... ci potrebbe essere un problema quando si gioca con le forme - se sia l'azione (il 'inoltro' e 'trasmesso al') hanno forme con invio, cadrai in una trappola - l'azione 'inoltrata a' vede il modulo $ _POST dal controller precedente, quindi si blocca su Token CSRF (non valido, dal modulo precedente. – thorinkor

+0

@thorinkor Esiste un modo valido per aggirarlo? Rigenerandolo in qualche modo? Ho provato con service security.csrf.token_manager e getToken() ma senza fortuna. – userfuser

+0

@userfuser la soluzione migliore - evitatelo :) Forse potreste provare ad ottenerlo dalla prima richiesta di modulo e inviarlo nuovamente nel metodo di inoltro? – thorinkor

0

Forwarding "richiesta di attributi" come "percorso" funziona per me:

public function indexAction() 
{ 
    $path = $this->getRequest()->attributes->all(); 
    return $this->forward('CompMyBundle:MyController:MyAction', $path); 
} 

$ path [ '_ controller'] verrà sovrascritto in forward() metodo!

7

Tutti i parametri POST vengono automaticamente inoltrati. Non è necessaria alcuna azione per avere il parametro POST nel controller di destinazione. Ma devi passare esplicitamente parametri (GET) di query e parametri di percorso. Il metodo forward accetta 2 parametri opzionali che rappresentano rispettivamente gli array pathParam e queryParam.Si può solo passare tutti i param query dalla richiesta corrente

public testAction(Request $request){ 
    $pathParam = array(); //Specified path param if you have some 
    $queryParam = $request->query->all(); 
    $response = $this->forward("AcmeBundle:Forward:new", $pathParam, $queryParam); 
} 
+0

migliore risposta alla domanda originale – Black