Parametri della stringa di query di CakePHP 3.0 e parametri passati
-
21-12-2019 - |
Domanda
In CakePHP 3.0 i parametri con nome sono stati rimossi (grazie a Dio) a favore dei parametri della stringa di query standard in linea con altri framework applicativi.
Ciò che sto ancora faticando a capire è che in altri framework MVC, ad esempio ASP.NET, passeresti i parametri in ActionResult (come la funzione):
Edit( int id = null ) {
// do stuff with id
}
E a quel metodo verrebbe passato l'id come una stringa di query come: /Edit?id=1
e utilizzeresti Routing per renderlo simile a: /Edit/1
.
In CakePHP tuttavia qualsiasi cosa passava all'interno dei parametri della funzione come:
function edit( $id = null ) {
// do stuff with $id
}
Deve essere eseguito come parametro passato come: /Edit/1
che ignora l'idea della stringa di query e anche la necessità di instradare per migliorare l'URL.
Se chiamo i parametri nel collegamento per quella modifica come:
$this->Html->link('Edit', array('action' => 'edit', 'id' => $post->id));
allora devo fare:
public function edit() {
$id = $this->request->query('id');
// do stuff with $id
}
Per ottenere il parametro id passato.Penserei che lo riprenderebbe nella funzione come in ASP.NET per CakePHP 3.0, ma non è così.
Preferisco anteporre i valori passati nel collegamento di modifica invece di passarli semplicemente, quindi non devo preoccuparmi tanto dell'ordinale dall'altra parte e so cosa sono, ecc.
Qualcuno ha provato con uno di questi modi per passare i dati ai propri metodi in CakePHP e può far luce sui modi corretti di fare le cose e su come i cambiamenti nella versione 3.0 miglioreranno le cose in quest'area...
Soluzione
Ci sono alcuni tipi di parametri di richiesta in CakePHP 3.0.Esaminiamoli:
La stringa di query:si accede con $this->request->query()
, non vengono passati alle funzioni del controller come argomenti e devi farlo per creare un collegamento Html->link('My link', ['my_query_param' => $value])
Argomentazioni superate:Il tipo speciale di argomento è quello ricevuto dalla funzione del controller come argomento.È possibile accedervi come argomento o tramite ispezione $this->request->params['pass']
.Costruisci collegamenti con argomenti passati a seconda del percorso, ma per il percorso predefinito aggiungi semplicemente parametri posizionali al collegamento come Html->link('My link', ['action' => view, $id, $secondPassedArg, $thirdPassedArg])
Richiedi parametri:Gli argomenti passati sono un sottotipo di questo.Un parametro di richiesta è un valore che può vivere nella richiesta a partire dalle informazioni che potrebbero essere estratte dal percorso.I parametri possono essere convertiti in altri tipi di parametri durante la loro vita.
Considera questo percorso:
Router::connect('/articles/:year/:month/:day', [
'controller' => 'articles', 'action' => 'archive'
]);
Abbiamo effettivamente creato 3 parametri di richiesta con quel percorso: year
, month
E day
ed è possibile accedervi con $this->request->year
$this->request->month
E $this->request->day
.Per creare un collegamento per questo facciamo:
$this->Html->link(
'My Link',
['action' => 'archive', 'year' => $y, 'month' => $m, 'day' => $d]
);
Tieni presente che poiché la rotta specifica tali parametri, questi non vengono convertiti come parametri della stringa di query.Ora, se volessimo convertirli in argomenti passati, colleghiamo invece questo percorso:
Router::connect('/articles/:year/:month/:day',
['controller' => 'articles', 'action' => 'archive'],
['pass' => ['year', 'month', 'day']]
);
La nostra funzione del controller ora sarà simile a:
function archive($year, $month, $day) {
...
}