我在使用Kohana 3.3设置RESTful API时遇到问题。我已将以下模块(分支3.3 / release / v2.0)https://github.com/michal-m/kohana-modules-restful添加到我的引导程序中。
Kohana::modules(array(
'restful' => MODPATH.'restful'
));
我创建了一个新的控制器Controller_Api
,它扩展了RESTful_Controller
并执行了get
,update
,create
,delete
个动作。在我的路线文件中,我有:
Route::set('api', '(<controller>(/<action>(/<id>)))')
->defaults(array(
'controller' => 'api',
'action' => 'index'
));
但我遇到的问题是我去的时候:http://example.com/api/user/1
我收到以下错误,表示我的路线错误,但我无法解决:
Kohana_HTTP_Exception [ 404 ]: Unable to find a route to match the URI: api/user/1
答案 0 :(得分:2)
首先,获取最新的3.3/release/2.0
版本。它还不是最终的,但我刚推了两个重要的修补程序。
其次,您必须添加路由过滤器以将请求方法(GET,POST等)转换为适当的操作。您可以使用随模块提供的模块,如下所示:
Route::set('api', '(<controller>(/<action>(/<id>)))')
->filter('RESTful::route_filter')
->defaults(array(
'controller' => 'api',
'action' => 'index'
));
或者自己创建一个简单的例子:
Route::set('api', '(<controller>(/<action>(/<id>)))')
->filter(function($route, $params, $request){
$params['action'] = strtolower($request->method());
return $params;
})
->defaults(array(
'controller' => 'api',
'action' => 'index'
));
答案 1 :(得分:0)
restful
模块是否已成功添加?例如,您可以尝试Kohana::autoload('RESTful_Controller')
(返回布尔值)。Route::all()
,您将看到所有路线的添加顺序。 $route = Route::get('api');
$request = Request::factory('api/user/1');
// since 3.3 Route::matches requires Request object
$params = $route->matches($request);
$params
应包含Request
个参数名称(控制器,操作等)。如果您的路线不正确,$params
为假。
答案 2 :(得分:0)
我使用路由过滤器。 3.3版本中添加的路由过滤器。 例如:
bootstrap.php中
Route::set('users', '(<controller>(/<id>))')
->filter(function ($route, $params, $request) {
$params['action'] = strtolower($request->method()) . '_' . $params['action'];
return $params;
})
->defaults(array('controller' => 'Users', 'action' => 'user'));
bootstrap.php(如果需要检查身份验证)
Route::set('users', '(<controller>(/<id>))')
->filter(function ($route, $params, $request) {
if (Auth::instance()->logged_in())
{
$params['action'] = strtolower($request->method()) . '_' . $params['action'];
}
else
{
$params['action'] = 'noauth';
}
return $params;
})
->defaults(array('controller' => 'Users', 'action' => 'user'));
我的控制器会删除代码。
<?php defined('SYSPATH') or die('No direct script access.');
class Controller_Users extends Controller {
public function action_get_user ()
{
// GET method
}
public function action_post_user ()
{
// POST method
}
public function action_put_user ()
{
// PUT method
}
public function action_delete_user ()
{
// DELETE method
}
public function action_noauth ()
{
// No authentication response
}
}