2014-01-10 2 views
5

В CakePHP 3.0 именованные параметры были удалены (слава богу) в пользу стандартных параметров строки запроса, встроенных в другие прикладные среды.Параметры строки запроса CakePHP 3.0 и переданные параметры

То, что я до сих пор пытаюсь получить мою голову вокруг, хотя в том, что в других рамках MVC, например ASP.NET вы бы передать параметры в ActionResult (такой же, как функция):

Edit(int id = null) { 

    // do stuff with id 

} 

И этот метод будет передан id как строка запроса, например: /Edit?id=1, и вы использовали бы Routing, чтобы он выглядел примерно так: /Edit/1.

В CakePHP однако ничего прошло внутри параметры функции, как:

function edit($id = null) { 

    // do stuff with $id 

} 

Должен быть сделан как передаваемый параметр, как: /Edit/1, который обходит идею строки запроса, а также необходимость для маршрутизации для улучшения URL.

Если я назвать Params в ссылке для этой правки как:

$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 улучшат ситуацию в этой области ...

ответ

10

Есть несколько типов параметров запроса в CakePHP 3.0. Давайте рассмотрим их:

Запросы Строка: доступно с $this->request->query(), не передается в контроллере функции в качестве аргументов и для того, чтобы сделать ссылку, что вам нужно сделать Html->link('My link', ['my_query_param' => $value])

Пройдены аргументами: Специальным тип аргумента - тот, который получен функцией контроллера в качестве аргумента. К ним обращаются либо в качестве аргумента, либо путем проверки $this->request->params['pass']. Вы строите связи с прошедшими аргументами в зависимости от маршрута, но маршрут по умолчанию вы просто добавить позиционный Params по ссылке как Html->link('My link', ['action' => view, $id, $secondPassedArg, $thirdPassedArg])

Запроса Params: Пройденные аргументы подтип этого. Параметр запроса - это значение, которое может находиться в запросе из информации, которая может быть извлечена из маршрута. Парамы могут быть преобразованы в другие типы параметров во время их жизни.

Рассмотрим этот маршрут:

Router::connect('/articles/:year/:month/:day', [ 
    'controller' => 'articles', 'action' => 'archive' 
]); 

Мы фактически создали 3 запроса Params с этим маршрутом: 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] 
); 

Обратите внимание, что в качестве маршрута указать эти параметры, они не преобразуются в строки запроса Params. Теперь, если мы хотим, чтобы преобразовать те переданные аргументы, мы связываем этот маршрут вместо:

Router::connect('/articles/:year/:month/:day', 
    ['controller' => 'articles', 'action' => 'archive'], 
    ['pass' => ['year', 'month', 'day']] 
); 

Нашей функция контроллер теперь будет выглядеть следующим образом:

function archive($year, $month, $day) { 
    ... 
} 
+0

Почему CakePHP позволяет выбирать между типами, как ему кажется более чистым в ASP.NET от того, что я видел до сих пор, по умолчанию до строк запроса, пока вы не используете маршрутизатор, чтобы сделать его красивой версией (которую вы видите по умолчанию в CakePHP через переданные параметры). Спасибо за информацию Jose, очень ценю. – Cameron

Смежные вопросы