2013-04-24 81 views
0

我在使用Kohana 3.3設置RESTful API時遇到問題。我已將以下模塊(分支3.3/release/v2.0),https://github.com/michal-m/kohana-modules-restful添加到我的引導程序中。Kohana 3.3 RESTful API路由錯誤

我創建了一個新的控制器,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

+0

我是組件創建者。你可以確認你正在使用哪個分支,它是'主'嗎? – 2013-04-25 07:01:06

+0

@MichalM我正在使用'3.3/release/v2.0' – xylar 2013-04-25 08:22:17

+0

我在模塊中發現了一個錯誤,可能會在區分大小寫的文件系統上導致此問題。正在修復。當它修復時會讓你知道。 – 2013-04-25 17:14:20

回答

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' 
)); 
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 PARAM名稱(控制器,動作等)。如果您的路線不正確,$params爲假。

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 
    } 
}