我正在探索一些 PHP 框架,目前的领跑者是 Kohana。
拥有 Rails 背景,我已经习惯了 rails 社区所称的“RESTful”路由。因此,“GET /posts”会显示所有帖子,并由 Posts Controller 的 index 方法处理。“POST /posts”创建一个新的 post 对象,并由 Posts Controller 的不同方法处理。
由于这两个请求中的路径相同,因此路由器需要根据 HTTP 方法做出决策。
Kohana 的路由器能做到这一点吗?
Kohana 默认不支持 RESTful 路由,但是有一个RESTful模块添加了对它的支持。有关用法,请参阅RESTful wiki。
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() 方法处理。
PS:内置的 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',
));