2012-07-23 19 views
17

Forse mi manca qualcosa ma non sembra esserci un modo per definire i parametri della querystring nei percorsi in Symfony2 in modo che possano essere passati in un controller.Symfony2: come passare i parametri url querystring ai controller?

Per esempio, invece di generare un URI come /blog/my-blog-post (da Symfony2 di routing documentation) e passando al seguente percorso:

# app/config/routing.yml  
blog_show: 
    pattern: /blog/{slug} 
    defaults: { _controller: AcmeBlogBundle:Blog:show } 

io preferirei di generare un URI come /blog?slug=my-blog-post. Il problema è che non riesco a trovare da nessuna parte per definire il parametro slug nel file di configurazione del percorso (come la sua controparte {slug} sopra).

Forse questo è di proposito, ma qual è la procedura migliore per lavorare con i parametri GET nella querystring?

La documentazione ne fa menzione nello Generating URLs with Query Strings, quindi come passarli nel controller?

Dove posso trovare menzione di loro è Symfony2 and HTTP Fundamentals:

use Symfony\Component\HttpFoundation\Request; 

$request = Request::createFromGlobals(); 

// retrieve GET variables 
$request->query->get('foo'); 

È questo la prassi migliore per lavorare con loro all'interno del controllore?

risposta

44

utilizzare parametri GET/POST in un controller che si estende Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller:

public function updateAction() 
{ 
    $request = $this->getRequest(); 
    $request->query->get('myParam'); // get a $_GET parameter 
    $request->request->get('myParam'); // get a $_POST parameter 
    ... 
} 

Per un controller che non si estende il controller di base Symfony, dichiarare l'oggetto di richiesta come un parametro del metodo dell'azione e procedere come sopra:

public function updateAction(Request $request) 
{ 
    $request->query->get('myParam'); // get a $_GET parameter 
    $request->request->get('myParam'); // get a $_POST parameter 
    ... 
} 
+12

Da Symfony 2.4, il metodo 'getRequest()' non è w deprecato e si dovrebbe usare il secondo trucco, con il parametro 'Request' nel metodo controller. il metodo 'getRequest()' sarà rimosso in Symfony 3. – Brewal

+0

@Brewal: ma se hai un 'Controller' che estende' Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller' e che ha già parametri come definiti nella sua rotta, puoi ancora ottenere la richiesta in questo modo o devi semplicemente usare 'Request :: createFromGlobals()' adesso? – fritzmg

+1

È ancora possibile ottenere la richiesta grazie al tipo 'Richiesta' specificato poco prima della variabile' $ request'. Symfony è abbastanza intelligente da indovinarlo. – Brewal

26

Non è possibile specificare i parametri della stringa di query nei file di configurazione del routing. Li ottieni dall'oggetto $ request nel tuo controller: $request->query->get('foo'); (sarà null se non esiste).

E per generare un percorso con un dato parametro, si può fare in voi Twig modelli del genere:

{{ path(route, query|merge({'page': 1})) }} 

Se si desidera generare un percorso nel vostro controller, è proprio come sono nella documentazione collegati:

$router->generate('blog', array('page' => 2, 'category' => 'Symfony')); 

genererà il percorso /blog/2?category=Symfony (i parametri che non esistono nella definizione della rotta saranno passati come stringhe di query).

+0

documentazione: [generando-URL-con-query-stringhe] (http://symfony.com/doc/current/routing.html#generating-urls -with-query-stringhe) – Stphane

Problemi correlati