摘要:大家知道我最近在給阿北的知識分享微信小程序改版,使用的是中的功能,接下來把遇到的一些問題及小技巧分享一下。小結以上就是目前為止在使用的開發小程序時候使用的一些知識和技巧,希望對你有用,以后如果有再分享哈。
大家知道我最近在給“阿北的知識分享”微信小程序改版,使用的是yii2中的restful功能,接下來把遇到的一些問題及小技巧分享一下。
先安利一下小程序碼 鏈接
開始分享。
URL要重寫我們知道restful風格的url一般是這樣的
GET /users
POST /users
DELETE /users/1
我們yii2默認的url形式是index.php?r=controller/action。
雖然說yii2已經提供了專門針對于restful的路由規則,但是我們還是需要服務器支持url重寫把index.php去掉。
我用的是nginx,如下配置
location / { if (!-e $request_filename){ rewrite ^/(.*) /index.php last; } }
如果你的是apache可以如下配置
// Apache需要支持url重寫其AllowOverride為all AllowOverride:all //web目錄下增加.htaccess,隱藏index.php文件 內容如下 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了
默認情況下yii2的restful已經提供了index、view、update、create和delete共5個action來滿足于對資源的不同行為。可能你的接口中不需要delete,有兩個方法
url規則中配置(推薦)
比如我不希望開放 DELETE /users/1 則可以配置對應的url規則如下
[ "class" => "yii estUrlRule", "controller" => "user", "except"=>["delete"] ],
重寫action
我們知道這些內置方法使用了actions方法實現,我們可以復寫這個函數。
class UserController extends ActiveController { public $modelClass = "appmodelsUser"; public function actions() { $actions = parent::actions(); unset($actions["delete"]); return $actions; } ... }
兩種方法都可以實現但是返回結果不相同,感興趣的同學可以自己體驗下。
加個action叫abc內置方法滿足了很多,需求太復雜我想自己在控制器里增加一個actionAbc的方法,如何配置那?看下面的代碼,還是在urlManager里搞定。
[ "class" => "yii estUrlRule", "controller" => "user", "except"=>["delete","update","index"], "extraPatterns"=>[ "POST abc"=>"abc", ] ],
這樣你就可以通過 POST /users/abc 來調用User控制器的abc Action了。
我要更多數據我想通過 GET /users 獲取會員的id和nickname字段,很簡單在get參數中傳入fields="id,nickname",這很容易畢竟id和nickname就是user表的列,但是我還想獲得每個會員下的訂單數,而訂單數并不屬于user表,方法如下
增加get參數
我們需要增加一個叫做expand的參數,值為你要獲取的字段名字,逗號分隔每一個。
GET /users?fields="id,nickname"&expand="oTotal"
配置user模型
我們需要重寫一個叫做extraFields的方法
public function extraFields() { return [ "oTotal" ]; }
編寫具體邏輯
接下來我們要在User模型中編寫實現oTotal的函數
public function getOTotal(){ return Order::find()->where(["user_id"=>$this->id])->count(); }
你發現了什么?你是否記起了在yii2中一個叫做關聯的概念,你是否發現獲取多種數據變得很簡單了?
json怎么病了使用小程序發起服務器請求,比如新建一本書,我們一般喜歡編寫如下代碼
wx.request({ method: "POST", data: { name: name }, url: app.globalData.remoteUrl + "/books", header: { "content-type": "application/json" }, success: function (res) { } })
這里我設置了"content-type": "application/json",問題發生了,我在服務器端無法獲取json中的name值。
很簡單,默認情況下yii2的restful并不支持對請求中json的數據解析,還好小小配置下就可以了。
// config/web.php "components" => [ "request" => [ "cookieValidationKey" => "", "parsers" => [ "application/json" => "yiiwebJsonParser", ] ], ]
增加一個JsonParser解析器就可以了。
認證問題網頁上有登錄,但是restful上沒有session,沒關系我們可以使用access token來搞定,配置很簡單。
比如我現在要求GET /users 必須是登陸后訪問。
配置user模型和表
首先為user表配置一個access_token字段,同時在User模型下做一個generateAccessToken方法
public function generateAccessToken(){ $this->access_token = Yii::$app->security->generateRandomString(); }
該方法主要用于生成access_token值。
當然我們的User模型需要實現 yiiwebIdentityInterface 接口,否則使用Yii::$app->user無法訪問的,關于IdentityInterface我想在yii2登錄這里已經很熟悉了,記住restful的認證如果生效還要實現如下方法
public static function findIdentityByAccessToken($token, $type = null) { $model = User::find()->where(["access_token"=>$token])->one(); return $model; }
到這里User模型就配置好了,小提醒:如果你想做一些登錄那一刻的事兒,可以也放到findIdentityByAccessToken,比如記錄登錄時間啥的。
配置action
接下來我們來對具體的接口進行認證限制,復寫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認證,就是在請求的header里面寫Authorization,yii2的restful還支持其他的。記住這個認證過程是自動的,并且我們在認證的方法里可以使用Yii::$app->user->id獲取當前會員的ID。
列表更多參數我們知道通過 GET /users 可以獲得會員列表,但是你可能說我要獲取來自于微信平臺的會員(user表里有一個字段plat代表來源平臺),怎么辦?
我們需要重新編寫該接口并接受plat參數,在User控制器中先設置新的prepareDataProvider函數,它用來接收參數并生成會員列表數據,返回的是一個ActiveDataProvider結果集。
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我要自定義獲取結果集的方法,接下來定義這個方法,在prepareDataProvider里可以通過Yii::$app->request->queryParams 接收過來的get參數的值。
小結以上就是目前為止在使用yii2的restful開發小程序時候使用的一些知識和技巧,希望對你有用,以后如果有再分享哈。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/28135.html
摘要:服務教程在它提出十多年后的今天,已經成為最重要的應用技術之一。全方位提升網站打開速度前端后端新的技術如何在內完整打開網站會直接影響用戶的滿意度及留存率,在前端后端數據緩存加速等等方面都有諸多可以提升。 HTTPS 原理剖析與項目場景 最近手頭有兩個項目,XX 導航和 XX 產業平臺,都需要使用 HTTPS 協議,因此,這次對 HTTPS 協議做一次整理與分享。 使用緩存應該注意哪些問題...
摘要:往期回顧打怪升級小程序評論回復和發貼功能實戰二填坑手冊小程序生成海報一拆彈時刻小程序生成海報二填坑手冊小程序目錄結構和組件使用心得 showImg(https://segmentfault.com/img/remote/1460000019733090?w=818&h=516); 在學習成長的過程中,常常會遇到一些自己從未接觸的事物,這就好比是打怪升級,每次打倒一只怪,都會獲得經驗,讓...
閱讀 3070·2023-04-25 16:50
閱讀 904·2021-11-25 09:43
閱讀 3512·2021-09-26 10:11
閱讀 2518·2019-08-26 13:28
閱讀 2531·2019-08-26 13:23
閱讀 2419·2019-08-26 11:53
閱讀 3566·2019-08-23 18:19
閱讀 2987·2019-08-23 16:27