Параметры строки запроса CakePHP 3.0 в сравнении с переданными параметрами

StackOverflow https://stackoverflow.com//questions/21034180

  •  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) {
  ...
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top