2012-04-27 13 views
8

Qui puoi trovare il mio n -th domanda su Symfony2.Come ottenere in fase di esecuzione il nome della rotta in Symfony2 quando si utilizza la descrizione delle rotte yaml?

Sto lavorando con un pagination bundle che utilizza il nome del percorso fornito nel file routing.yml. Dal mio punto di vista, questo approccio non è flessibile e porta a un codice sporco, poiché se cambio il nome del percorso, allora devo guardare tutti i modelli Twig o file PHP per aggiornare il nome del percorso. Questo è ok per le piccole applicazioni Web, ma fornirà un tale errore per le applicazioni più grandi e avrà anche un onere elevato per lo sviluppatore.

Quindi, mi chiedevo di passare una variabile di stringa x all'oggetto Pager fornito dal pacchetto sopra menzionato. La stringa x deve essere inizializzata all'interno del controller e deve fornire il nome della route desiderata come indicato nel file routing.yml.

Lasciatemi fare un esempio. Il file di instradamento è la seguente:

//routing.yml 
AcmeTestBundle_listall: 
pattern: /test/page/{page} 
defaults: { _controller: AcmeTestBundle:List:listall, page: 1 } 
requirements: 
    page: \d+ 

Poi il controllore correlato è:

//use something.... 
class ListController extends Controller 
{ 

    public function exampleAction($page) 
    { 
    $array = range(1, 100); 
    $adapter = new ArrayAdapter($array); 
    $pager = new Pager($adapter, array('page' => $page, 'limit' => 25)); 

    return array('pager' => $pager); 
    } 
} 

Poi, nel modello ramoscello, il $pager riceve il nome della rotta che si riferiscono al fascio sopra

{% if pager.isPaginable %} 
    {{ paginate(pager, 'AcmeTestBundle_listall') }} 
{% endif %} 
{% for item in pager.getResults %} 
    <p>{{ item }}</p> 
{% endfor %} 

Qualche idea su come ottenere il valore di stringa 'AcmeTestBundle_listall' in fase di esecuzione all'interno del controller?

risposta

30

È possibile utilizzare la variabile globale app disponibile in ramoscello per ottenere il percorso corrente dalla richiesta.

{% if pager.isPaginable %} 
    {{ paginate(pager, app.request.get('_route') }} 
{% endif %} 

più su apphere e here.

+0

Sicuro! Grazie mille! Risposta veloce e chiara ... molto apprezzata! – JeanValjean

+0

Per aggiungere a questo, se hai bisogno dei parametri del percorso, usa app.request.get ('_ route_params') –

+3

Symfony memorizza il nome della rotta come * attributo * della Richiesta, quindi dovrebbe essere meglio recuperato come tale: 'app .request.attributes.get ('_ route') '. Evita di usare il metodo 'Request :: get()' perché cerca prima di recuperare il parametro dal sacchetto dei parametri di query - la borsa degli attributi è usata solo come fallback. Detto questo, usando 'Request :: get()', un utente può sovrascrivere '_route' aggiungendo'? _route = my_tainted_param' all'URL. –

Problemi correlati