日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > php >内容正文

php

php restful yii,yii2 restful 风格搭建(一)

發(fā)布時(shí)間:2024/9/30 php 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php restful yii,yii2 restful 风格搭建(一) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近在研究 yii2 如何搭建 restful api,將心得寫(xiě)下,歡迎一起討論

使用yii2.0.13 advanced 版,將 frontend 整個(gè)作為 api 接口項(xiàng)目,除了接口的路由規(guī)則可以認(rèn)證通過(guò)外,其他的路由規(guī)則都返回請(qǐng)求錯(cuò)誤的格式

1、數(shù)據(jù)庫(kù)結(jié)構(gòu)

CREATE TABLE `goods` (

`id` int(11) unsigned NOT NULL AUTO_INCREMENT,

`name` varchar(255) NOT NULL,

`price` int(11) unsigned NOT NULL,

`status` tinyint(1) unsigned NOT NULL,

`create_time` int(11) unsigned NOT NULL,

`modify_time` int(11) unsigned NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

2、使用 gii 創(chuàng)建 goods model

3、創(chuàng)建 api modules

在 frontend 下新建文件夾 modules

使用 gii 在 modules 文件中創(chuàng)建 v1 module(防止以后接口更新替換時(shí)向前兼容,接口增加 v1 v2 等版本控制)

4、將 v1 moduel 寫(xiě)到配置文件中

'modules' => [

'v1' => [

'class' => 'frontend\modules\v1\Module',

],

],

5、修改 frontend 下 main.php 中,user 的配置(以下說(shuō)的配置文件,都是 frontend 下 main.php)

'user' => [

'identityClass' => 'frontend\models\User',

'enableAutoLogin' => false,

'enableSession' => false,

'loginUrl' => null,

],

6、新建 frontend\models\User,繼承 common\models\User

namespace frontend\models;

class User extends \common\models\User{

}

7、啟用并修改配置文件中的 urlManager

調(diào)試 urlManager 的時(shí)候要小心,他會(huì)將生成好的路由寫(xiě)入緩存(默認(rèn)是文件緩存),有些更改可能不會(huì)立馬生效

'urlManager' => [

//用于表明 urlManager 是否啟用 URL 美化功能

//默認(rèn)不啟用。但實(shí)際使用中,特別是產(chǎn)品環(huán)境,一般都會(huì)啟用

'enablePrettyUrl' => true,

//是否啟用嚴(yán)格解析,如啟用嚴(yán)格解析,要求當(dāng)前請(qǐng)求應(yīng)至少匹配1個(gè)路由規(guī)則,否則認(rèn)為是無(wú)效路由。

//這個(gè)選項(xiàng)僅在 enablePrettyUrl 啟用后才有效。

//如果開(kāi)啟,表示只有配置在 rules 里的規(guī)則才有效

//由于項(xiàng)目會(huì)將一些 url 進(jìn)行優(yōu)化,所以這里需要設(shè)置為 true

'enableStrictParsing' => true,

//指定是否在URL在保留入口腳本 index.php

'showScriptName' => false,

'rules' => [

//當(dāng)然,如果自帶的路由無(wú)法滿足需求,可以自己增加規(guī)則

'GET //search' => '//search',

[

'class' => 'yii\rest\UrlRule',

'controller' => ['v1/goods'],

// 由于 resetful 風(fēng)格規(guī)定 URL 保持格式一致并且始終使用復(fù)數(shù)形式

// 所以如果你的 controller 是單數(shù)的名稱比如 UserController

// 設(shè)置 pluralize 為 true (默認(rèn)為 true)的話,url 地址必須是 users 才可訪問(wèn)

// 如果 pluralize 設(shè)置為 false, url 地址必須是 user 也可訪問(wèn)

// 如果你的 controller 本身是復(fù)數(shù)名稱 UsersController ,此參數(shù)沒(méi)用,url 地址必須是 users

'pluralize' => false,

],

],

],

8、去掉配置文件中的 errorHandler 配置(整個(gè) frontend 都是接口,不需要 html 的響應(yīng)格式)

9、將內(nèi)容協(xié)商配置到引導(dǎo)文件中(因?yàn)檎麄€(gè) frontend 都需要)

'bootstrap' => [

'log',

//全局內(nèi)容協(xié)商

[

//ContentNegotiator 類可以分析request的header然后指派所需的響應(yīng)格式給客戶端,不需要我們?nèi)斯ぶ付?/p>

'class' => 'yii\filters\ContentNegotiator',

'formats' => [

'application/json' => yii\web\Response::FORMAT_JSON,

'application/xml' => yii\web\Response::FORMAT_XML,

//api 端目前只需要json 和 xml

//還可以增加 yii\web\Response 類內(nèi)置的響應(yīng)格式,或者自己增加響應(yīng)格式

],

]

],

10、配置文件中,components 配置 response,返回格式

'response' => [

'class' => 'yii\web\Response',

//設(shè)置 api 返回格式,錯(cuò)誤碼不在 header 里實(shí)現(xiàn),而是放到 body里

'as resBeforeSend' => [

'class' => 'frontend\extensions\ResBeforeSendBehavior',

'defaultCode' => 500,

'defaultMsg' => 'error',

],

//ps:components 中綁定事件,可以用兩種方法

//'on eventName' => $eventHandler,

//'as behaviorName' => $behaviorConfig,

//參考 http://www.yiiframework.com/doc-2.0/guide-concept-configurations.html#configuration-format

],

11、編寫(xiě) frontend\extensions\ResBeforeSendBehavior 代碼

namespace frontend\extensions;

use Yii;

use yii\web\Response;

use yii\base\Behavior;

class ResBeforeSendBehavior extends Behavior{

public $defaultCode = 500;

public $defaultMsg = 'error';

// 重載events() 使得在事件觸發(fā)時(shí),調(diào)用行為中的一些方法

public function events(){

// 在 EVENT_BEFORE_SEND 事件觸發(fā)時(shí),調(diào)用成員函數(shù) beforeSend

return [

Response::EVENT_BEFORE_SEND => 'beforeSend',

];

}

// 注意 beforeSend 是行為的成員函數(shù),而不是綁定的類的成員函數(shù)。

// 還要注意,這個(gè)函數(shù)的簽名,要滿足事件 handler 的要求。

public function beforeSend($event){

try {

$response = $event->sender;

if($response->data === null){

$response->data = [

'code'=> $this->defaultCode,

'msg'=> $this->defaultMsg,

];

} elseif(!$response->isSuccessful) {

$exception = Yii::$app->getErrorHandler()->exception;

if(is_object($exception) && !$exception instanceof yii\web\HttpException){

throw $exception;

} else {

$rData = $response->data;

$response->data = [

'code'=> empty($rData['status']) ? $this->defaultCode : $rData['status'],

'msg'=> empty($rData['message']) ? $this->defaultMsg : $rData['message'],

];

}

} else {

/**

* $response->isSuccessful 表示是否會(huì)拋出異常

* 值為 true, 代表返回?cái)?shù)據(jù)正常,沒(méi)有拋出異常

*/

$rData = $response->data;

$response->data = [

'code' => isset($rData['error_code']) ? $rData['error_code'] : 0,

'msg' => isset($rData['res_msg']) ? $rData['res_msg'] : $rData,

];

$response->statusCode = 200;

}

} catch (\Exception $e) {

$response->data = [

'code'=> $this->defaultCode,

'msg'=> $this->defaultMsg,

];

}

return true;

}

}

12、創(chuàng)建 GoodsController.php

namespace frontend\modules\v1\controllers;

use yii\rest\ActiveController;

class GoodsController extends ActiveController{

public $modelClass = 'common\models\Goods';

public function actionSearch(){

return [

'error_code'=> 20,

'res_msg'=> 'ok',

];

}

}

13、應(yīng)用入口同級(jí)增加.htaccess文件,隱藏index.php,以apache為例

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule .* index.php

14、測(cè)試

命令:

curl -s -H Accept:application/xml http://local.rest.com/v1/goods/1

返回:

0

1

測(cè)試商品1

600

1

1520490595

1520490595

命令

curl -s -H Accept:application/json http://local.rest.com/v1/goods/1

返回

{

"code":0,

"msg":{

"id":"1",

"name":"測(cè)試商品1",

"price":"600",

"status":1,

"create_time":"1520490595",

"modify_time":"1520490595"

}

}

命令

curl -s -H Accept:application/json http://local.rest.com/v1/goods11

返回

{"code":404,"msg":"Page not found."}

命令

curl -s -H Accept:application/json http://local.rest.com/v1/goods/search

返回

{"code":20,"msg":"ok"}

15、參考

與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的php restful yii,yii2 restful 风格搭建(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。