Come posso generare un URL amichevole in Symfony PHP?
Domanda
Tendo sempre a dimenticare questi built-in Symfony funzioni per creare collegamenti.
Soluzione
Se il tuo obiettivo è avere URL intuitivi in tutta la tua applicazione, utilizza il seguente approccio:
1) Crea una regola di routing per il tuo modulo/azione nel file routing.yml dell'applicazione.L'esempio seguente è una regola di instradamento per un'azione che mostra le domande più recenti in un'applicazione, per impostazione predefinita alla pagina 1 (utilizzando un cercapersone):
recent_questions:
url: questions/recent/:page
param: { module: questions, action: recent, page: 1 }
2) Una volta impostata la regola di routing, utilizzare il file url_for()
helper nel modello per formattare gli URL in uscita.
<a href="<?php echo url_for('questions/recent?page=1') ?>">Recent Questions</a>
In questo esempio, verrà costruito il seguente URL: http://myapp/questions/recent/1.html
.
3) Gli URL in entrata (richieste) verranno analizzati dal sistema di routing e, se viene trovata una corrispondenza di modello nella configurazione della regola di routing, i caratteri jolly denominati (ad es.IL :/page
parte dell'URL) diventeranno parametri della richiesta.
Puoi anche usare il link_to()
helper per generare un URL senza utilizzare l'HTML <a>
etichetta.
Altri suggerimenti
Questo consiglio è per symfony 1.0.Probabilmente funzionerà per le versioni successive.
All'interno della tua classe sfAction:
string genUrl($parametri = array(), $assoluto = false)
per esempio.$this->getController()->genUrl('yourmodule/youraction?key=value&key2=value', true);
In un modello:
Questo genererà un collegamento normale.
string link_to($nome, $internal_uri, $opzioni = array());
per esempio.link_to('Nome del mio collegamento', 'il tuo modulo/la tua azione? chiave=valore&chiave2=valore');
Inoltre, se desideri effettivamente una stringa di query con quell'URL, utilizza questo:
link_to('My link name', 'yourmodule/youraction?key=value&key2=value',array('query_string'=>'page=2'));
Altrimenti, proverà a instradarlo come parte dell'URL e probabilmente interromperà l'azione.
Puoi generare l'URL direttamente senza prima definire la regola.
Se desideri generare URL nelle azioni, puoi utilizzare generareUrl() aiutante:
$this->generateUrl('default', array('module'=>'[ModuleName]','action'=>'[ActionName]'))
Se desideri generare URL nei modelli, puoi utilizzare url_per() aiutante:
url_for('[ModuleName]/[ActionName]', $absolute)
imposta $absolute come true/false, non dimenticare di usare echo se vuoi visualizzarlo.
Ma se vuoi fare un collegamento (qualcosa di simile a <a href=""></a>
), Collegamento a() l'aiutante lo farà.