Параметры строки запроса CakePHP 3.0 в сравнении с переданными параметрами
-
21-12-2019 - |
Вопрос
В CakePHP 3.0 именованные параметры были удалены (слава богу) в пользу стандартных параметров строки запроса, встроенных в другие платформы приложений.
Однако я все еще пытаюсь разобраться в том, что в других фреймворках MVC, например ASP.NET вы бы передали параметры в ActionResult (так же, как и в функции):
Edit( int id = null ) {
// do stuff with id
}
И этому методу будет передан идентификатор в виде строки запроса, например: /Edit?id=1
и вы бы использовали маршрутизацию, чтобы сделать ее похожей на: /Edit/1
.
Однако в CakePHP все, что передается внутри параметров функции, например:
function edit( $id = null ) {
// do stuff with $id
}
Должно быть выполнено как переданный параметр, например: /Edit/1
который обходит идею строки запроса, а также необходимость маршрутизации для улучшения URL.
Если я назову параметры в ссылке для этого редактирования следующим образом:
$this->Html->link('Edit', array('action' => 'edit', 'id' => $post->id));
Затем я должен сделать:
public function edit() {
$id = $this->request->query('id');
// do stuff with $id
}
Чтобы получить доступ к переданному идентификатору параметра.Конечно, я думал, что это будет отображено в функции, как в ASP.NET для CakePHP 3.0, но это не так.
Я предпочитаю указывать префикс переданных значений в ссылке редактирования, а не просто передавать их, поэтому мне не нужно так сильно беспокоиться о порядковом номере на другом конце, и я знаю, что это такое и т.д.
Кто-нибудь играл с любым из этих способов передачи данных своим методам в CakePHP и может пролить больше света на правильные способы выполнения действий и на то, как изменения в версии 3.0 улучшат ситуацию в этой области?..
Решение
В CakePHP 3.0 существует несколько типов параметров запроса.Давайте рассмотрим их:
Строка запроса:доступны с помощью $this->request->query()
, не передаются функциям контроллера в качестве аргументов , и для создания ссылки вам нужно выполнить Html->link('My link', ['my_query_param' => $value])
Переданные аргументы:Специальный тип аргумента - это тот, который принимается функцией контроллера в качестве аргумента.Доступ к ним осуществляется либо как к аргументу, либо путем проверки $this->request->params['pass']
.Вы создаете ссылки с переданными аргументами в зависимости от маршрута, но для маршрута по умолчанию вы просто добавляете позиционные параметры к ссылке, например Html->link('My link', ['action' => view, $id, $secondPassedArg, $thirdPassedArg])
Запрашивать параметры:Переданные аргументы являются подтипом этого аргумента.Параметр запроса - это значение, которое может содержаться в запросе на основе информации, которая может быть извлечена из маршрута.Параметры могут быть преобразованы в параметры других типов в течение срока их службы.
Рассмотрим этот маршрут:
Router::connect('/articles/:year/:month/:day', [
'controller' => 'articles', 'action' => 'archive'
]);
Мы фактически создали 3 параметра запроса с этим маршрутом: year
, month
и day
и к ним можно получить доступ с помощью $this->request->year
$this->request->month
и $this->request->day
.Чтобы создать ссылку для этого, мы делаем:
$this->Html->link(
'My Link',
['action' => 'archive', 'year' => $y, 'month' => $m, 'day' => $d]
);
Обратите внимание, что поскольку маршрут указывает эти параметры, они не преобразуются в параметры строки запроса.Теперь, если мы хотим преобразовать их в переданные аргументы, мы подключаем этот маршрут вместо этого:
Router::connect('/articles/:year/:month/:day',
['controller' => 'articles', 'action' => 'archive'],
['pass' => ['year', 'month', 'day']]
);
Наша функция контроллера теперь будет выглядеть следующим образом:
function archive($year, $month, $day) {
...
}