PHP 基于 SW-X 框架,搭建高性能API架構(gòu)(三)

前言

官網(wǎng)地址:SW-X框架-專注高性能便捷開發(fā)而生的PHP-SwooleX框架

希望各大佬舉起小手,給小弟一個(gè)star:https://github.com/swoolex/swoolex

1、什么是Restful組件

在SW-X中,Restful組件是對(duì)API返回值結(jié)構(gòu)的封裝支持。
\x\Restful類支持定義返回值的結(jié)構(gòu)、Code->Msg關(guān)聯(lián)、返回值強(qiáng)類型轉(zhuǎn)換、拋出的數(shù)據(jù)類型轉(zhuǎn)換、響應(yīng)的請(qǐng)求頭定義(跨域支持)。

2、Restful的設(shè)置

API返回值的使用,主要依賴/restful/目錄中的config.php配置項(xiàng)目,初始化默認(rèn)配置如下:

<?php
return [
    // 返回值類型 支持 json|xml
    'type' => 'json',
    // 默認(rèn)的返回值格式
    'default' => [
         'force'  => true, // 是否強(qiáng)制返回值 int|double|null類型轉(zhuǎn)換
         'status' => 'code', // 狀態(tài)碼字段名
         'tips'   => 'msg',  // 描述字段名
         'result' => 'data', // 結(jié)果集字段名
         'set'    => [], // 默認(rèn)結(jié)果集
         'headers' => [], // 響應(yīng)頭,可用于跨域設(shè)置(v2.5.23版本前支持)
    ],
]

其中default為默認(rèn)的數(shù)據(jù)結(jié)構(gòu),當(dāng)我們不使用\x\Restful::make('新的下標(biāo)')指定新的返回值結(jié)構(gòu)時(shí),默認(rèn)使用該結(jié)構(gòu),如果我們需要設(shè)置新的返回值結(jié)構(gòu),只需要復(fù)制default的數(shù)組結(jié)構(gòu),將下標(biāo)改為新值即可。

同時(shí),/restful/目錄下還存在一個(gè)default目錄,該目錄是對(duì)應(yīng)default默認(rèn)的返回值結(jié)構(gòu),用于存放code狀態(tài)碼和msg狀態(tài)說明。

如果設(shè)置了新的數(shù)據(jù)結(jié)構(gòu),則需要復(fù)制default目錄,并重命名為對(duì)應(yīng)的下標(biāo)名。

下面我們來看下default目錄下的兩個(gè)文件:

Code狀態(tài)碼,/restful/default/code.php

<?php
// 狀態(tài)碼管理
return [
    'ERROR' => 0, // 默認(rèn)失敗狀態(tài)碼
    'SUCCESS' => 1, // 默認(rèn)成功狀態(tài)碼
];

在實(shí)際應(yīng)用時(shí),我們只需要通過\x\Restful::狀態(tài)碼鍵名()的方式來讀取對(duì)應(yīng)的狀態(tài)碼值,例如使用SUCCESS的狀態(tài)碼就用\x\Restful::SUCCESS()。

Msg說明,/restful/default/msg.php

<?php
// 狀態(tài)說明管理
return [
    // 默認(rèn)錯(cuò)誤狀態(tài)碼對(duì)應(yīng)的tips
    'ERROR' => [
        'default' => '請(qǐng)求失敗', // 默認(rèn)值
    ],
    // 默認(rèn)成功狀態(tài)碼對(duì)應(yīng)的tips
    'SUCCESS' => [
        'default' => '請(qǐng)求成功', // 默認(rèn)值
        'test' => '測(cè)試msg',
    ],
];

狀態(tài)碼說明是一個(gè)二維數(shù)組,一維下標(biāo)需要對(duì)應(yīng)狀態(tài)碼的下標(biāo),同時(shí)必須存在一個(gè)名為default的二維下標(biāo)。

這樣設(shè)計(jì)的初衷是由于,在實(shí)際應(yīng)用中,同一個(gè)狀態(tài)碼可能存在多個(gè)不同的說明,這樣就可以通過指定下標(biāo)讀取對(duì)應(yīng)的說明,當(dāng)不指定時(shí),讀取default下標(biāo)。

例如:

use x\Restful;

// 讀取的就是SUCCESS['default']說明,默認(rèn)使用default
Restful::code(Restful::SUCCESS())->callback();

// 指定msg下標(biāo),讀取的就是SUCCESS['test']說明
Restful::code(Restful::SUCCESS())->msg('test')->callback();

3、Restful組件的更多示例

use x\Restful;

// 自定義msg內(nèi)容
return Restful::code(Restful::SUCCESS())->setMsg('把我拋出了,沒用到msg.php里的配置')->callback();

// 自定義拋出類型
return Restful::type('xml')->code(Restful::SUCCESS())->callback();

// 設(shè)置拋出的數(shù)據(jù)集
return Restful::code(Restful::SUCCESS())->data([
    'user_id' => 1,
    'username' => 'SW-X',
])->callback();

// 設(shè)置跨域支持
return Restful::code(Restful::SUCCESS())->header([
    // 接口跨域設(shè)置
    'origin' => '*',
    // 接口數(shù)據(jù)請(qǐng)求類型
    'type' => '',
    // 接口跨域允許請(qǐng)求的類型
    'methods' => 'POST,GET,OPTIONS,DELETE',
    // 接口是否允許發(fā)送 cookies
    'credentials' => 'true',
    // 接口允許自定義請(qǐng)求頭的字段
    'headers' => 'Content-Type,Content-Length,Accept-Encoding,X-Requested-with, Origin, api_key',
])->callback();

4、在控制器中使用Restful的簡(jiǎn)單示例

接回上一篇文章,我們修改shop/select.php路由對(duì)應(yīng)的控制器代碼:

<?php
namespace app\http\v1_0_1\controller\shop;
use x\controller\Http;
// 引入Restful組件
use x\Restful;

class select extends Http
{
    public function index() {
        // Restful組件拋出接口響應(yīng)
        return Restful::code(Restful::SUCCESS())->data([
            'user_id' => '1',
            'username' => 'SW-X',
        ])->callback();
    }
}

輸出結(jié)果:

{
  "code": 1,
  "msg": "請(qǐng)求成功",
  "data": {
    "user_id": 1,
    "username": "SW-X"
  }
}

5、枚舉

如果你不習(xí)慣Restful組件風(fēng)格管理API接口返回值的話,SW-X還支持Enum枚舉定義的方式。

枚舉類必須繼承至\design\Enum基類,官方建議統(tǒng)一定義在/box/enum/目錄下,但不強(qiáng)制要求。

下面我們就在該目錄下,創(chuàng)建一個(gè)ShopEnum類,代碼如下:

<?php
namespace box\enum;
// 必須繼承枚舉基類
use design\Enum;

class ShopEnum extends Enum {
    /*
     * 錯(cuò)誤異常
    */
    const ERROR = 500;
    /**
     * 正常請(qǐng)求
    */
    const SUCCESS = 200;
}

注意上面的注釋風(fēng)格,其注釋內(nèi)容,就是狀態(tài)碼對(duì)應(yīng)的MSG內(nèi)容。

6、枚舉類的使用示例

use box\enum\ShopEnum;
// 獲得對(duì)應(yīng)的Msg內(nèi)容
echo ShopEnum::get(ShopEnum::ERROR);

// 組裝成code-msg-data的數(shù)組結(jié)構(gòu)(該3個(gè)字段名都是系統(tǒng)固定的)
ShopEnum::get(ShopEnum::ERROR, [
    'data' => [
        'user_id' => 1
    ]
]);
結(jié)果集:
array(3) {
  ["code"]=>
  int(500)
  ["msg"]=>
  string(12) "錯(cuò)誤異常"
  ["data"]=>
  array(1) {
    ["user_id"]=>
    int(1)
  }
}

// 自定義數(shù)據(jù)結(jié)構(gòu):
$ret = [
    'code' => ShopEnum::ERROR,
    'msg' => ShopEnum::get(ShopEnum::ERROR),
    'data => [],
];

7、在控制器中使用枚舉的簡(jiǎn)單示例

接回上一篇文章,我們修改shop/select.php路由對(duì)應(yīng)的控制器代碼:

<?php
namespace app\http\v1_0_1\controller\shop;
use x\controller\Http;
// 引入自定義枚舉類
use box\enum\ShopEnum;

class select extends Http
{

    public function index() {
        $array = ShopEnum::get(ShopEnum::ERROR, [
                'data' => [
                'user_id' => 1
            ]
        ]);
        return $this->fetch(dd($array));
    }
}

輸出結(jié)果:

array(3) {
  ["code"] => int(500)
  ["msg"] => string(12) "錯(cuò)誤異常"
  ["data"] => array(1) {
    ["user_id"] => int(1)
  }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容