最近在作Yii2.0 RESTful API功能,找了很久的資料,才找到這類的教程,感謝該做者,如下內容根據個人項目實際狀況作了必定的修改。php
安裝 Composer 後,您能夠經過在 Web 可訪問的文件夾下運行如下命令來 安裝Yii應用程序模板:mysql
composer create-project --prefer-dist yiisoft/yii2-app-basic basic
cd advanced ./init
Yii Application Initialization Tool v1.0 Which environment do you want the application to be initialized in? [0] Development [1] Production Your choice [0-1, or "q" to quit] 0 Initialize the application under 'Development' environment? [yes|no] yes Start initialization ...
打開 common\config\main-local.php,配置數據庫鏈接信息sql
'db' => [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=127.0.0.1;dbname=yii', 'username' => 'root', 'password' => 'root', 'charset' => 'utf8', ],
./yii migrate
return [ 'id' => 'app-api', 'basePath' => dirname(__DIR__), 'controllerNamespace' => 'api\controllers', ]
'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, 'rules' => [ ], ],
Yii::setAlias('@api', dirname(dirname(__DIR__)) . '/api');
單首創建API應用,目的是便於維護,能夠避免如下問題數據庫
接下來打開 api\controllers 新建一個User控制器,繼承 yii\rest\ActiveController,命名爲 UserController,代碼以下:json
<?php namespace api\controllers; use yii\rest\ActiveController; class UserController extends ActiveController { public $modelClass = 'common\models\User'; }
爲剛纔的 user控制器添加url美化規則
打開 api\config\main.php 修改 components屬性,添加下列代碼:bootstrap
... 'urlManager' => [ 'enablePrettyUrl' => true, 'enableStrictParsing' => true, 'showScriptName' => false, 'rules' => [ ['class' => 'yii\rest\UrlRule', 'controller' => 'user' ], ], ] ...
ok,到此就成了一個 符合 RESTful 風格的API
看起來在控制器了什麼也沒有寫,只是指定了一個模型,可是她的背後完成了不少的功能哦,列表以下:segmentfault
你可使用 curl命令進行訪問,命令以下:api
curl -i -H "Accept:application/json" "http://localhost/users"
命令行下仍是比較麻煩的,也不方便測試,推薦使用 API測試工具yii2
這類的工具備不少,我就不一一列舉了,這裏推薦 Postman,很好很強大,Chorme也有插件,能夠安裝,這裏我推薦直接下載軟件安裝調試,比較方便app
你可能發現了 訪問任何路由地址都是加的s,users , 爲何呢? 資源,你要理解 資源二字,既然是資源確定是個集合,確定有一大堆,因此要加上覆數,我是這麼理解的。
你說我就是不想加上s,我就想採用http://localhost/user 這種方式來進行訪問,好吧,能夠,知足你,只是不推薦
繼續打開配置文件api\config\main.php修改剛纔添加的 urlManager 以下:
'urlManager' => [ 'enablePrettyUrl' => true, 'enableStrictParsing' => true, 'showScriptName' => false, 'rules' => [ ['class' => 'yii\rest\UrlRule', 'controller' => 'user', 'pluralize' => false, //設置爲false 就能夠去掉複數形式了 ], ], ]
加入 'pluralize' => false, 就表示去掉複數形式了,再次強調不推薦
ok,在控制器中咱們沒有寫任何一句代碼,他就給咱們生成許多方法,可是有時候咱們可能須要修改一些代碼,來達到咱們想要的效果,好比連表查詢,而後再返回數據
接下來咱們就實現這樣的功能:
打開剛纔新建的user控制器, 重寫 action方法:
<?php namespace api\controllers; use yii\rest\ActiveController; class UserController extend extends ActiveController { public $modelClass = 'common\models\User'; public function actions() { $action= parent::actions(); // TODO: Change the autogenerated stub unset($action['index']); unset($action['create']); unset($action['update']); unset($action['delete']); } public function actionIndex() { //你的代碼 } }
這樣咱們就能夠重寫他的代碼了。哈哈
咱們再新建一個本身的 action
<?php namespace api\controllers; use yii\rest\ActiveController; class UserController extends ActiveController { public $modelClass = 'common\models\User'; public function actions() { $action= parent::actions(); // TODO: Change the autogenerated stub unset($action['index']); unset($action['create']); unset($action['update']); unset($action['delete']); } public function actionIndex() { //你的代碼 } public function actionTest() //假如是get請求 { //業務邏輯 } }
而後試着訪問一下 http://localhost/users/test,報錯?找不到?
報錯就對了,那是由於咱們沒有設置其餘路由訪問
修改 api\config\main.php
'urlManager' => [ 'enablePrettyUrl' => true, 'enableStrictParsing' => true, 'showScriptName' => false, 'rules' => [ ['class' => 'yii\rest\UrlRule', 'controller' => 'user', //'pluralize' => false, //設置爲false 就能夠去掉複數形式了 'extraPatterns'=>[ 'GET send-email'=>'test' ], ], ], ]
接下來從新訪問就沒有問題了,ps:你本身編寫的任何 action 都要在 extraPatterns 進行配置
再次感謝如下: