Могу ли я настроить маршруты в Kohana так, чтобы они соответствовали только определенным методам HTTP (GET/POST/и т. д.)
Вопрос
Я изучаю несколько PHP-фреймворков, и на данный момент фаворитом является Kohana.
Имея опыт работы с Rails, я привык к тому, что сообщество Rails называет «RESTful» маршрутами.Таким образом, «GET /posts» отображает все сообщения и обрабатывается индексным методом контроллера сообщений.«POST /posts» создает новый объект сообщения и обрабатывается другим методом контроллера сообщений.
Поскольку путь в обоих этих двух запросах идентичен, маршрутизатору необходимо принимать решения на основе метода HTTP.
Способен ли роутер в Кохане это сделать?
Решение
Kohana по умолчанию не поддерживает маршруты RESTful, но есть RESTful модуль, который добавляет его поддержку.См. RESTful вики для использования.
Kohana v3.x напрямую поддерживает контроллеры RESTful.Просто продлите Controller_REST
вместо Controller
и все действия маршрута будут методом запроса.(А POST
запрос будет нацелен на action_post
, и т. д.)
Другие советы
Вы также можете добавить эти строки в метод before() вашего контроллера:
if ($this->request->method() == "POST")
{
$this->request->action("post_".$this->request->action());
}
поэтому GET /controller/posts будет обрабатываться методом action_posts() в вашем контроллере, а POST /controller/posts будет обрабатываться методом action_post_posts().
ПС:Встроенный Controller_REST был удален в Kohana 3.2.
Проверка метода HTTP в конструкторе класса мне кажется плохим дизайном.Как и Rails, Kohana 3.3 может создавать маршруты RESTful в маршрутизаторе (где им и место).
Ознакомьтесь с документацией по Kohana 3.3 Фильтры маршрутов.
Вот пример:
Route::set('Posts', 'posts/<id>', array('id' => '\d+'))
->filter(function($route, $params, $request) {
$params['action'] = strtolower($request->method());
return $params;
})
->defaults(array(
'controller' => 'Post',
));