Kohana 3.3 RESTful API路由错误

时间:2013-04-24 23:28:34

标签: rest kohana kohana-3.3

我在使用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并执行了getupdatecreatedelete个动作。在我的路线文件中,我有:

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

3 个答案:

答案 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)

  1. restful模块是否已成功添加?例如,您可以尝试Kohana::autoload('RESTful_Controller')(返回布尔值)。
  2. 查看路线列表。常见错误是在默认全能路径后添加自定义路线。致电Route::all(),您将看到所有路线的添加顺序。
  3. 您的路线看起来不错,但您可以测试一下:
  4.       $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
    }
}