Yii2.0 RESTful API 基礎配置教程[轉載]

willeny發表於2019-02-16

最近在做Yii2.0 RESTful API功能,找了好久的資料,才找到這類的教程,感謝該作者,以下內容根據我的專案實際情況做了一定的修改。

安裝yii2.0

安裝 Composer 後,您可以通過在 Web 可訪問的資料夾下執行以下命令來 安裝Yii應用程式模板:

composer create-project --prefer-dist yiisoft/yii2-app-basic basic

初始化高階模板

cd advanced
./init

輸入”./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 ...

修改資料庫連線屬性

開啟 commonconfigmain-local.php,配置資料庫連線資訊

`db` => [
            `class` => `yiidbConnection`,
            `dsn` => `mysql:host=127.0.0.1;dbname=yii`,
            `username` => `root`,
            `password` => `root`,
            `charset` => `utf8`,
        ],

執行 migrate 資料庫遷移

./yii migrate

拷貝backend目錄,命名為api

  • 開啟apiconfigmain.php 修改id,controllerNamespace等,將所有backend替換為api
return [
    `id` => `app-api`,
    `basePath` => dirname(__DIR__),
    `controllerNamespace` => `apicontrollers`,
]
  • 開啟apiconfigmain.php開啟url路由美化規則
`urlManager` => [
            `enablePrettyUrl` => true,
            `showScriptName` => false,
            `rules` => [
            ],
        ],
  • 開啟commonconfigootstrap.php新增以下別名
Yii::setAlias(`@api`, dirname(dirname(__DIR__)) . `/api`);

為什麼要單獨建立API應用

單獨建立API應用,目的是便於維護,可以避免以下問題

  • 配置的衝突
  • 控制器的命名不便
  • url美化規則衝突
  • 分工明確frontend為前臺目錄;backend為後臺目錄;api為api目錄

接下來開啟 apicontrollers 新建一個User控制器,繼承 yii
estActiveController,命名為 UserController,程式碼如下:

<?php
namespace apicontrollers;
use yii
estActiveController;

class UserController extends ActiveController
{
    public $modelClass = `commonmodelsUser`;
    
}

配置URL規則

為剛才的 user控制器新增url美化規則
開啟 apiconfigmain.php 修改 components屬性,新增下列程式碼:

...
`urlManager` => [
    `enablePrettyUrl` => true,
    `enableStrictParsing` => true,
    `showScriptName` => false,
    `rules` => [
        [`class` => `yii
estUrlRule`, 
        `controller` => `user`
        ],
    ],
]

...

ok,到此就成了一個 符合 RESTful 風格的API
看起來在控制器了什麼也沒有寫,只是指定了一個模型,但是她的背後完成了很多的功能哦,列表如下:

  • GET /users: 逐頁列出所有使用者
  • HEAD /users: 顯示使用者列表的概要資訊
  • POST /users: 建立一個新使用者
  • GET /users/123: 返回使用者 123 的詳細資訊
  • HEAD /users/123: 顯示使用者 123 的概述資訊
  • PATCH /users/123: and PUT /users/123: 更新使用者123
  • DELETE /users/123: 刪除使用者123
  • OPTIONS /users: 顯示關於末端 /users 支援的動詞
  • OPTIONS /users/123: 顯示有關末端 /users/123 支援的動詞

如何訪問呢

你可以使用 curl命令進行訪問,命令如下:

curl -i -H "Accept:application/json" "http://localhost/users"

命令列下還是比較麻煩的,也不方便測試,推薦使用 API測試工具

這類的工具有很多,我就不一一列舉了,這裡推薦 Postman,很好很強大,Chorme也有外掛,可以安裝,這裡我推薦直接下載軟體安裝除錯,比較方便

你可能發現了 訪問任何路由地址都是加的s,users , 為什麼呢? 資源,你要理解 資源二字,既然是資源肯定是個集合,肯定有一大堆,所以要加上覆數,我是這麼理解的。

你說我就是不想加上s,我就想採用http://localhost/user 這種方式來進行訪問,好吧,可以,滿足你,只是不推薦

繼續開啟配置檔案apiconfigmain.php修改剛才新增的 urlManager 如下:

`urlManager` => [
    `enablePrettyUrl` => true,
    `enableStrictParsing` => true,
    `showScriptName` => false,
    `rules` => [
        [`class` => `yii
estUrlRule`, 
        `controller` => `user`,
        `pluralize` => false,    //設定為false 就可以去掉複數形式了
        ],
    ],
]

加入 `pluralize` => false, 就表示去掉複數形式了,再次強調不推薦

ok,在控制器中我們沒有寫任何一句程式碼,他就給我們生成許多方法,但是有時候我們可能需要修改一些程式碼,來達到我們想要的效果,比如連表查詢,然後再返回資料

接下來我們就實現這樣的功能:

開啟剛才新建的user控制器, 重寫 action方法:

<?php

namespace apicontrollers;
use yii
estActiveController;

class UserController extend extends ActiveController
{
    public $modelClass = `commonmodelsUser`;
    
    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 apicontrollers;
use yii
estActiveController;

class UserController extends ActiveController
{
    public $modelClass = `commonmodelsUser`;
    
    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,報錯?找不到?

報錯就對了,那是因為我們沒有設定其他路由訪問

修改 apiconfigmain.php

`urlManager` => [
    `enablePrettyUrl` => true,
    `enableStrictParsing` => true,
    `showScriptName` => false,
    `rules` => [
        [`class` => `yii
estUrlRule`, 
        `controller` => `user`,
        //`pluralize` => false,    //設定為false 就可以去掉複數形式了
        `extraPatterns`=>[
            `GET send-email`=>`test`
        ],
        ],
    ],
]

接下來重新訪問就沒有問題了,ps:你自己編寫的任何 action 都要在 extraPatterns 進行配置

再次感謝以下:

https://segmentfault.com/a/11…

相關文章