2011-07-11 111 views
0

嗨,我正在尋找一些關於將請求路由到Yii框架中的自定義模塊的信息。將路由請求發送到模塊

我正在爲一個項目實現一個RestFul Api,並希望有一些方法可以簡單地將所有請求路由到api /到其他api所在的模塊。甚至比這更好的是,如果將api請求路由到一個自定義的UrlManager類,該類繼承模塊中的CUrlManager,然後處理這些路由,那就更好了。因此對mydomain/api/user/model的請求實際上會被延遲並由模塊中的UrlManager組件處理,而其他請求(即mydoamin.com/client/create)將僅由正常的yii應用程序處理。據我可以告訴這是不可能的!

因此,我會滿足於definig在我的配置映入像這樣

class UrlManager extends CUrlManager 
{ 
    protected function processRules() 
    { 
     if(!isset($_GET['r'])) 
     {   
      $this->setUrlFormat('path'); 
      $this->showScriptName=false; 
      $this->rules=array(

       //Api Rest Patterns 
       array('api/list', 'pattern'=>'^api/user/<model:\w+>', 'verb'=>'GET'), 
       array('api/view', 'pattern'=>'^api/user/<model:\w+>/<id:\d+>', 'verb'=>'GET'), 
       array('api/update', 'pattern'=>'^api/user/<model:\w+>/<id:\d+>', 'verb'=>'PUT'), 
       array('api/delete', 'pattern'=>'^api/user/<model:\w+>/<id:\d+>', 'verb'=>'DELETE'), 
       array('api/add', 'pattern'=>'^api/user/<model:\w+>', 'verb'=>'POST'), 
       array('api/test', 'pattern'=>'^api/user/test/<model:\w+>'), 
       array('api/login', 'pattern'=>'^api/user/<model:\w+>/login'), 
       array('api/logout', 'pattern'=>'^api/user/<model:\w+>/logout'), 


       // Other controllers 
       '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>', 
       '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',     
       '<action:\w+>'=>'site/<action>', 
      ); 
     } 
     return parent::processRules(); 
    } 
} 

我的問題是那麼的api路由的URL管理器類,我如何將請求路由到模塊控制器?即模塊/ RESTAPI /控制器/ UserApiController.php

array('ModuleController/action' , pattern=>'api/user/<model>' , 'verb'=>'GET) 

我想過這個

'controllerMap' => array(
    'api'=>'application.modules.RestApi.components.ApiManager', 
), 

但是我很肯定我需要訪問的兩個點,一個用於管理任務的API和一個處理對於用戶來說,所以目前我的控制器的結構是這樣的:

  • RestApiController
  • UserApiController(擴展RestApiController)
  • AdminApiController(擴展RestApiController)

所以,如果有一種方式來動態路由的行動給孩子控制器,可能會奏效?希望我沒有在這裏混淆真的希望你們Yii Masters可以幫助解決這個問題!

在此先感謝

+0

任何人有任何想法? –

回答

1

我可能誤解了你的問題(所以糾正我,如果我做了),但你不能只用正常urlmanager與配置,像這樣「正常」的規則:

'rules' = array(
    //Api Rest Patterns 
    array('restApi/userApi/list', 'pattern'=>'^api/user/<model:\w+>', 'verb'=>'GET'), 
    array('restApi/userApi/view', 'pattern'=>'^api/user/<model:\w+>/<id:\d+>', 'verb'=>'GET'), 
    array('restApi/userApi/update', 'pattern'=>'^api/user/<model:\w+>/<id:\d+>', 'verb'=>'PUT'), 
    array('restApi/userApi/delete', 'pattern'=>'^api/user/<model:\w+>/<id:\d+>', 'verb'=>'DELETE'), 
    array('restApi/userApi/add', 'pattern'=>'^api/user/<model:\w+>', 'verb'=>'POST'), 
    array('restApi/userApi/test', 'pattern'=>'^api/user/test/<model:\w+>'), 
    array('restApi/userApi/login', 'pattern'=>'^api/user/<model:\w+>/login'), 
    array('restApi/userApi/logout', 'pattern'=>'^api/user/<model:\w+>/logout'), 


    // Other controllers 
    '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>', 
    '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',     
    '<action:\w+>'=>'site/<action>', 
) 

我很確定這樣的事情應該可以工作(雖然不完全確定駱駝鞋)。模塊操作的路由爲'<moduleid>/<controllerid>/<actionid>',我知道這肯定是因爲我多次使用它。