0

我在使用 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

4

3 回答 3

2

首先,获取最新3.3/release/2.0版本。它还不是最终版本,但我刚刚推送了 2 个重要的修补程序。

其次,您必须添加一个路由过滤器来将请求方法(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'
));
于 2013-04-25T17:33:53.863 回答
0
  1. restful模块添加成功了吗?例如,您可以尝试Kohana::autoload('RESTful_Controller')(返回布尔值)。
  2. 查看您的路线列表。常见的错误是在默认的包罗万象的路线之后添加您的自定义路线。呼叫Route::all(),您将按添加顺序查看所有路线。
  3. 您的路线看起来正确,但您可以对其进行测试:
      $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则为 FALSE。

于 2013-04-25T04:51:43.750 回答
0

我正在使用路由过滤器。3.3 版本中添加了路由过滤器。例子:

引导程序.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
    }
}
于 2014-05-19T23:33:24.217 回答