Могу ли я настроить маршруты в Кохане так, чтобы они соответствовали только определенным методам HTTP (GET / POST / etc) - PullRequest
8 голосов
/ 15 июля 2009

Я изучаю несколько PHP-фреймворков, и в настоящее время лидером является Кохана.

Имея опыт работы с Rails, я привык к тому, что сообщество rails называет "RESTful" маршрутами. Таким образом, «GET / posts» отображает все сообщения и обрабатывается методом индекса контроллера сообщений. «POST / posts» создает новый объект post и обрабатывается другим методом контроллера сообщений.

Поскольку путь в обоих этих запросах одинаков, маршрутизатор должен принимать решения на основе метода HTTP.

Может ли маршрутизатор в Кохане сделать это?

Ответы [ 3 ]

8 голосов
/ 15 июля 2009

Kohana по умолчанию не поддерживает маршруты RESTful, но есть модуль RESTful , который добавляет его поддержку. См. RESTful wiki для использования.

Kohana v3.x напрямую поддерживает контроллеры RESTful. Просто расширьте Controller_REST вместо Controller, и все действия маршрута будут методом запроса. (Запрос POST будет направлен на action_post и т. Д.)

3 голосов
/ 19 августа 2011

Вы также можете добавить эти строки в метод before () вашего контроллера:

if ($this->request->method() == "POST")
{
  $this->request->action("post_".$this->request->action());
}

поэтому GET / controller / posts будет обрабатываться методом action_posts () в вашем контроллере, а POST / controller / posts будет обрабатываться методом action_post_posts ().

PS: встроенный Controller_REST был удален в Kohana 3.2

0 голосов
/ 30 ноября 2013

Проверка метода HTTP в конструкторе классов кажется мне плохим дизайном. Как и Rails, Kohana 3.3 может создавать RESTful-маршруты в маршрутизаторе (где они принадлежат).

Ознакомьтесь с документацией для Kohana 3.3 Route Filters .

Вот пример:

Route::set('Posts', 'posts/<id>', array('id' => '\d+'))
  ->filter(function($route, $params, $request) {
    $params['action'] = strtolower($request->method());
    return $params;
  })
  ->defaults(array(
    'controller' => 'Post',
  ));
...