O CakePHP 3.0 parâmetros de cadeia de consulta vs parâmetros passados
-
21-12-2019 - |
Pergunta
No CakePHP 3.0 parâmetros nomeados foram removidos (graças a deus) em favor do padrão de parâmetros de cadeia de consulta em linha com outras estruturas de aplicação.
O que eu ainda estou lutando para colocar minha cabeça em torno, porém, é que em outros frameworks MVC, por exemplo ASP.NET você gostaria de passar os parâmetros do ActionResult (mesma função):
Edit( int id = null ) {
// do stuff with id
}
E que método seria passada a identificação como uma seqüência de caracteres de consulta como: /Edit?id=1
e você usaria o Encaminhamento para torná-lo muito como: /Edit/1
.
No CakePHP no entanto nada passou dentro da função de parâmetros como:
function edit( $id = null ) {
// do stuff with $id
}
Deve ser feito como um parâmetro passado como: /Edit/1
que ignora a seqüência de caracteres de consulta idéia e também a necessidade de encaminhamento para melhorar o URL.
Se eu nome params no link para editar como:
$this->Html->link('Edit', array('action' => 'edit', 'id' => $post->id));
Em seguida, tenho de o fazer:
public function edit() {
$id = $this->request->query('id');
// do stuff with $id
}
Para obter o id do parâmetro passado.Seria, pensei que iria buscá-lo na função, como no ASP.NET para o CakePHP 3.0, mas ele não.
Eu prefiro prefixo passada valores no link editar em vez de apenas passando-os para que eu não precise de se preocupar com o ordinal tanto na outra extremidade, e eu sei o que eles são, etc.
Alguém já jogou com qualquer uma destas formas de transmissão de dados a seus métodos no CakePHP e pode lançar mais luz sobre as formas corretas de fazer as coisas e como as alterações na versão 3.0 vai melhorar as coisas nesta área...
Solução
Existem alguns tipos de solicitação params no CakePHP 3.0.Vamos analisá-los:
A Seqüência De Caracteres De Consulta:são acessados com $this->request->query()
, não são passados para as funções de controlador como argumentos e, para fazer um link que você precisa fazer Html->link('My link', ['my_query_param' => $value])
Argumentos passados:O especial tipo de argumento é aquele que é recebido pelo controlador de função como um argumento.Eles são acessados como o argumento ou inspecionando $this->request->params['pass']
.Você cria vínculos com o passado args dependendo da rota, mas para a rota padrão que você acabou de adicionar parâmetros posicionais para o link como Html->link('My link', ['action' => view, $id, $secondPassedArg, $thirdPassedArg])
Pedido Params:Argumentos passados são um subtipo de um presente.Um pedido param é um valor que pode viver no pedido de informação que pode ser extraída da rota.Parâmetros podem ser convertidos para outros tipos de parâmetros durante a sua vida.
Considere esta rota:
Router::connect('/articles/:year/:month/:day', [
'controller' => 'articles', 'action' => 'archive'
]);
Temos efetivamente criou 3 solicitação de parâmetros com que a rota: year
, month
e day
e eles podem ser acessados com $this->request->year
$this->request->month
e $this->request->day
.Para construir um link para isso fazemos:
$this->Html->link(
'My Link',
['action' => 'archive', 'year' => $y, 'month' => $m, 'day' => $d]
);
Note que, como a rota especificar esses parâmetros, eles não são convertidos como seqüência de caracteres de consulta de parâmetros.Agora, se quisermos converter-se aqueles aos argumentos passados, podemos ligar esta rota em vez disso:
Router::connect('/articles/:year/:month/:day',
['controller' => 'articles', 'action' => 'archive'],
['pass' => ['year', 'month', 'day']]
);
Nosso controlador de função aspecto agora:
function archive($year, $month, $day) {
...
}