成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

阿北的知識分享小程序中restful使用經(jīng)驗貼

Meils / 1801人閱讀

摘要:大家知道我最近在給阿北的知識分享微信小程序改版,使用的是中的功能,接下來把遇到的一些問題及小技巧分享一下。小結(jié)以上就是目前為止在使用的開發(fā)小程序時候使用的一些知識和技巧,希望對你有用,以后如果有再分享哈。

大家知道我最近在給“阿北的知識分享”微信小程序改版,使用的是yii2中的restful功能,接下來把遇到的一些問題及小技巧分享一下。

先安利一下小程序碼 鏈接

開始分享。

URL要重寫

我們知道restful風(fēng)格的url一般是這樣的

GET /users

POST /users

DELETE /users/1

我們yii2默認(rèn)的url形式是index.php?r=controller/action。

雖然說yii2已經(jīng)提供了專門針對于restful的路由規(guī)則,但是我們還是需要服務(wù)器支持url重寫把index.php去掉。

我用的是nginx,如下配置

location / {
    if (!-e $request_filename){
        rewrite ^/(.*) /index.php last;
    }
}

如果你的是apache可以如下配置

// Apache需要支持url重寫其AllowOverride為all
AllowOverride:all

//web目錄下增加.htaccess,隱藏index.php文件 內(nèi)容如下
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)?*$ index.php/$1 [L,QSA]
不要DELETE了

默認(rèn)情況下yii2的restful已經(jīng)提供了index、view、update、create和delete共5個action來滿足于對資源的不同行為??赡苣愕慕涌谥胁恍枰猟elete,有兩個方法

url規(guī)則中配置(推薦)
比如我不希望開放 DELETE /users/1 則可以配置對應(yīng)的url規(guī)則如下

[
    "class" => "yii
estUrlRule",
    "controller" => "user",
    "except"=>["delete"]
],

重寫action
我們知道這些內(nèi)置方法使用了actions方法實現(xiàn),我們可以復(fù)寫這個函數(shù)。

class UserController extends ActiveController {
    public $modelClass = "appmodelsUser";

    public function actions() {
        $actions = parent::actions();
        unset($actions["delete"]);
        return $actions;
    }

    ...
}

兩種方法都可以實現(xiàn)但是返回結(jié)果不相同,感興趣的同學(xué)可以自己體驗下。

加個action叫abc

內(nèi)置方法滿足了很多,需求太復(fù)雜我想自己在控制器里增加一個actionAbc的方法,如何配置那?看下面的代碼,還是在urlManager里搞定。

[
    "class" => "yii
estUrlRule",
    "controller" => "user",
    "except"=>["delete","update","index"],
    "extraPatterns"=>[
        "POST abc"=>"abc",
    ]
],

這樣你就可以通過 POST /users/abc 來調(diào)用User控制器的abc Action了。

我要更多數(shù)據(jù)

我想通過 GET /users 獲取會員的id和nickname字段,很簡單在get參數(shù)中傳入fields="id,nickname",這很容易畢竟id和nickname就是user表的列,但是我還想獲得每個會員下的訂單數(shù),而訂單數(shù)并不屬于user表,方法如下

增加get參數(shù)
我們需要增加一個叫做expand的參數(shù),值為你要獲取的字段名字,逗號分隔每一個。

GET /users?fields="id,nickname"&expand="oTotal"

配置user模型
我們需要重寫一個叫做extraFields的方法

public function extraFields() {
    return [
        "oTotal"
    ];
}

編寫具體邏輯
接下來我們要在User模型中編寫實現(xiàn)oTotal的函數(shù)

public function getOTotal(){
    return Order::find()->where(["user_id"=>$this->id])->count();
}

你發(fā)現(xiàn)了什么?你是否記起了在yii2中一個叫做關(guān)聯(lián)的概念,你是否發(fā)現(xiàn)獲取多種數(shù)據(jù)變得很簡單了?

json怎么病了

使用小程序發(fā)起服務(wù)器請求,比如新建一本書,我們一般喜歡編寫如下代碼

wx.request({
    method: "POST",
    data: {
        name: name
    },
    url: app.globalData.remoteUrl + "/books",
    header: {
        "content-type": "application/json"
    },
    success: function (res) {
        
    }
})

這里我設(shè)置了"content-type": "application/json",問題發(fā)生了,我在服務(wù)器端無法獲取json中的name值。

很簡單,默認(rèn)情況下yii2的restful并不支持對請求中json的數(shù)據(jù)解析,還好小小配置下就可以了。

// config/web.php
"components" => [
    "request" => [
        "cookieValidationKey" => "",
        "parsers" => [
            "application/json" => "yiiwebJsonParser",
        ]
    ],
]

增加一個JsonParser解析器就可以了。

認(rèn)證問題

網(wǎng)頁上有登錄,但是restful上沒有session,沒關(guān)系我們可以使用access token來搞定,配置很簡單。
比如我現(xiàn)在要求GET /users 必須是登陸后訪問。

配置user模型和表
首先為user表配置一個access_token字段,同時在User模型下做一個generateAccessToken方法

public function generateAccessToken(){
    $this->access_token = Yii::$app->security->generateRandomString();
}

該方法主要用于生成access_token值。

當(dāng)然我們的User模型需要實現(xiàn) yiiwebIdentityInterface 接口,否則使用Yii::$app->user無法訪問的,關(guān)于IdentityInterface我想在yii2登錄這里已經(jīng)很熟悉了,記住restful的認(rèn)證如果生效還要實現(xiàn)如下方法

public static function findIdentityByAccessToken($token, $type = null)
{
    $model = User::find()->where(["access_token"=>$token])->one();
    return $model;
}

到這里User模型就配置好了,小提醒:如果你想做一些登錄那一刻的事兒,可以也放到findIdentityByAccessToken,比如記錄登錄時間啥的。

配置action
接下來我們來對具體的接口進(jìn)行認(rèn)證限制,復(fù)寫behaviors行為,如下

use yiifiltersauthHttpBearerAuth;
class UserController extends ActiveController {
    public $modelClass = "appmodelsUser";

    public function behaviors() {

        $behaviors = parent::behaviors();
        $behaviors["contentNegotiator"]["formats"] = ["application/json"=>Response::FORMAT_JSON];

        $behaviors["authenticator"] = [
            "class"=>HttpBearerAuth::className(),
            "only"=>[
                "index"
            ],
        ];

        return $behaviors;
    }
}

這樣就搞定了,我們這里用的是HttpBearerAuth認(rèn)證,就是在請求的header里面寫Authorization,yii2的restful還支持其他的。記住這個認(rèn)證過程是自動的,并且我們在認(rèn)證的方法里可以使用Yii::$app->user->id獲取當(dāng)前會員的ID。

列表更多參數(shù)

我們知道通過 GET /users 可以獲得會員列表,但是你可能說我要獲取來自于微信平臺的會員(user表里有一個字段plat代表來源平臺),怎么辦?

我們需要重新編寫該接口并接受plat參數(shù),在User控制器中先設(shè)置新的prepareDataProvider函數(shù),它用來接收參數(shù)并生成會員列表數(shù)據(jù),返回的是一個ActiveDataProvider結(jié)果集。

namespace appmodulesxcxcontrollers;

use Yii;
use yii
estActiveController;
....

class UserController extends ActiveController {
    public $modelClass = "appmodelsUser";

    public function actions() {
        $actions = parent::actions();
        $actions["index"]["prepareDataProvider"] = [$this,"prepareDataProvider"];
        return $actions;
    }

    public function prepareDataProvider(){
        $params = Yii::$app->request->queryParams;

        $modelClass = $this->modelClass;
        $query = $modelClass::find()->where(["plat"=>$params["plat"]]);

        $provider = new ActiveDataProvider([
            "query"=>$query->orderBy(["created_at"=>SORT_DESC])
        ]);

        return $provider;
    }

}

首先通過 $actions["index"]["prepareDataProvider"] = [$this,"prepareDataProvider"] 告訴yii2我要自定義獲取結(jié)果集的方法,接下來定義這個方法,在prepareDataProvider里可以通過Yii::$app->request->queryParams 接收過來的get參數(shù)的值。

小結(jié)

以上就是目前為止在使用yii2的restful開發(fā)小程序時候使用的一些知識和技巧,希望對你有用,以后如果有再分享哈。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/28135.html

相關(guān)文章

  • 后端技術(shù)精選

    摘要:服務(wù)教程在它提出十多年后的今天,已經(jīng)成為最重要的應(yīng)用技術(shù)之一。全方位提升網(wǎng)站打開速度前端后端新的技術(shù)如何在內(nèi)完整打開網(wǎng)站會直接影響用戶的滿意度及留存率,在前端后端數(shù)據(jù)緩存加速等等方面都有諸多可以提升。 HTTPS 原理剖析與項目場景 最近手頭有兩個項目,XX 導(dǎo)航和 XX 產(chǎn)業(yè)平臺,都需要使用 HTTPS 協(xié)議,因此,這次對 HTTPS 協(xié)議做一次整理與分享。 使用緩存應(yīng)該注意哪些問題...

    GitCafe 評論0 收藏0
  • 后端技術(shù)精選

    摘要:服務(wù)教程在它提出十多年后的今天,已經(jīng)成為最重要的應(yīng)用技術(shù)之一。全方位提升網(wǎng)站打開速度前端后端新的技術(shù)如何在內(nèi)完整打開網(wǎng)站會直接影響用戶的滿意度及留存率,在前端后端數(shù)據(jù)緩存加速等等方面都有諸多可以提升。 HTTPS 原理剖析與項目場景 最近手頭有兩個項目,XX 導(dǎo)航和 XX 產(chǎn)業(yè)平臺,都需要使用 HTTPS 協(xié)議,因此,這次對 HTTPS 協(xié)議做一次整理與分享。 使用緩存應(yīng)該注意哪些問題...

    explorer_ddf 評論0 收藏0
  • 后端技術(shù)精選

    摘要:服務(wù)教程在它提出十多年后的今天,已經(jīng)成為最重要的應(yīng)用技術(shù)之一。全方位提升網(wǎng)站打開速度前端后端新的技術(shù)如何在內(nèi)完整打開網(wǎng)站會直接影響用戶的滿意度及留存率,在前端后端數(shù)據(jù)緩存加速等等方面都有諸多可以提升。 HTTPS 原理剖析與項目場景 最近手頭有兩個項目,XX 導(dǎo)航和 XX 產(chǎn)業(yè)平臺,都需要使用 HTTPS 協(xié)議,因此,這次對 HTTPS 協(xié)議做一次整理與分享。 使用緩存應(yīng)該注意哪些問題...

    Jensen 評論0 收藏0
  • [打怪升級]程序評論回復(fù)和發(fā)功能實戰(zhàn)(一)

    摘要:往期回顧打怪升級小程序評論回復(fù)和發(fā)貼功能實戰(zhàn)二填坑手冊小程序生成海報一拆彈時刻小程序生成海報二填坑手冊小程序目錄結(jié)構(gòu)和組件使用心得 showImg(https://segmentfault.com/img/remote/1460000019733090?w=818&h=516); 在學(xué)習(xí)成長的過程中,常常會遇到一些自己從未接觸的事物,這就好比是打怪升級,每次打倒一只怪,都會獲得經(jīng)驗,讓...

    YJNldm 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<