yii2框架-restful的自定义api

如果想不按照yii2默认规定的那些写接口来,如何重写或者自定义呢?

在yii\rest\ActiveController.php中

[php]  view plain  copy
 print ?
  1. public function actions()  
  2.     {  
  3.         return [  
  4.             'index' => [  
  5.                 'class' => 'yii\rest\IndexAction',  
  6.                 'modelClass' => $this->modelClass,  
  7.                 'checkAccess' => [$this'checkAccess'],  
  8.             ],  
  9.             'view' => [  
  10.                 'class' => 'yii\rest\ViewAction',  
  11.                 'modelClass' => $this->modelClass,  
  12.                 'checkAccess' => [$this'checkAccess'],  
  13.             ],  
  14.             'create' => [  
  15.                 'class' => 'yii\rest\CreateAction',  
  16.                 'modelClass' => $this->modelClass,  
  17.                 'checkAccess' => [$this'checkAccess'],  
  18.                 'scenario' => $this->createScenario,  
  19.             ],  
  20.             'update' => [  
  21.                 'class' => 'yii\rest\UpdateAction',  
  22.                 'modelClass' => $this->modelClass,  
  23.                 'checkAccess' => [$this'checkAccess'],  
  24.                 'scenario' => $this->updateScenario,  
  25.             ],  
  26.             'delete' => [  
  27.                 'class' => 'yii\rest\DeleteAction',  
  28.                 'modelClass' => $this->modelClass,  
  29.                 'checkAccess' => [$this'checkAccess'],  
  30.             ],  
  31.             'options' => [  
  32.                 'class' => 'yii\rest\OptionsAction',  
  33.             ],  
  34.         ];  
  35.     }  
这是默认的接口方法,那么如何重写呢?
我们可以在Controller中重写action()这个函数从而实现重写

[php]  view plain  copy
 print ?
  1. namespace api\modules\v1\controllers;  
  2. use Yii;  
  3. use yii\rest\ActiveController;  
  4. use yii\data\ActiveDataProvider;  
  5. use api\models\Order;  
  6.   
  7. class UsersController extends ActiveController {  
  8.     public $modelClass = 'api\modules\v1\models\User';  
  9.       
  10.     public function actions() {  
  11.         $actions = parent::actions();  
  12.         // 禁用""index,delete" 和 "create" 操作  
  13.         unset($actions['index'],$actions['delete'], $actions['create']);  
  14.           
  15.         return $actions;  
  16.   
  17.     }  
  18.     //重写index的业务实现  
  19.     public function actionIndex()  
  20.     {  
  21.         $modelClass = $this->modelClass;  
  22.         return new ActiveDataProvider([  
  23.             'query' => $modelClass::find()->asArray(),  
  24.               
  25.             'pagination' => false  
  26.         ]);  
  27.     }   
  28.   
  29. }  
a)因为访问的时候先去执行actions方法里面的对应独立操作,如果找不到再去找对应的内联操作。
b)actions方法的执行$actions = parent::actions();然后将$actions的需要重写的方法禁用(删除),然后return $actions 就没有这个方法了,所以就会执行内联操作actionIndex()这个方法,而我们的重写业务就是在这个actionIndex()方法中。其他的方法也是这样子重写。

如果我们想在自己定义不同的api接口方法呢?
那么我们可以通过配置实现,在main.php的主文件中

[php]  view plain  copy
 print ?
  1. 'urlManager' => [  
  2.     'enablePrettyUrl' => true,  
  3.     'showScriptName' => false,  
  4.     'rules' => [  
  5.         [  
  6.             'class' => 'yii\rest\UrlRule',  
  7.             'controller' => ['v1/users'],  
  8.             'pluralize' => false,  
  9.             'extraPatterns' => [  
  10.                 'GET versions' => 'version',  
  11.                 'GET search/' => 'search',  
  12.                 'POST newusers' => 'add'  
  13.             ],  
  14.               
  15.         ],  
  16.     ],  
  17. ],  
"extraPatterns"这个属性是额外模式配置
a)'GET versions' => 'version',代表获取接口版本,例如http://localhost/lianxi/XML/advanced/api/web/v1/users/versions ,对应的内联操作actionVersion();


b)'GET searches/' => 'search', 代表搜索一个指定id的用户,例如http://localhost/lianxi/XML/advanced/api/web/v1/users/searches/1,对应的内联操作actionSearches();



c)'POST newusers' => 'add',代表添加一个用户,例如http://localhost/lianxi/XML/advanced/api/web/v1/users/newusers,对应的内联操作actionAdd();

我们只需要在控制器中实现这些方法,完成相应的逻辑业务,那么各个需要的接口就完成了。

你可能感兴趣的:(yii2)