因為webman是常駐記憶體框架 當前進程初始化一次後就不會再初始化了 所以構造函數里傳遞request是不好用的。 這裡使用中間件來代替 瞭解中間件: 中間件一般用於攔截請求或者響應。例如執行控制器前統一驗證用戶身份,如用戶未登錄時跳轉到登錄頁面。例如響應中增加某個header頭。例如統計某個uri ...
因為webman是常駐記憶體框架
當前進程初始化一次後就不會再初始化了
所以構造函數里傳遞request是不好用的。
這裡使用中間件來代替
瞭解中間件:
中間件一般用於攔截請求或者響應。例如執行控制器前統一驗證用戶身份,如用戶未登錄時跳轉到登錄頁面。例如響應中增加某個header頭。例如統計某個uri請求占比等等。
中間件洋蔥模型:
中間件和控制器組成了一個經典的洋蔥模型,中間件類似一層一層的洋蔥表皮,控制器是洋蔥芯。如果所示請求像箭一樣穿越中間件1、2、3到達控制器,控制器返回了一個響應,然後響應又以3、2、1的順序穿出中間件最終返回給客戶端。也就是說在每個中間件里我們既可以拿到請求,也可以獲得響應,這樣我們就可以在中間件里做很多事情,例如攔截請求或者響應。
中間件介面:
中間件必須實現Webman\MiddlewareInterface
介面。
也就是必須實現process
方法,process
方法必須返回一個support\Response
對象,預設這個對象由$handler($request)
生成(請求將繼續向洋蔥芯穿越),也可以可以是response()
json()
xml()
redirect()
等助手函數生成的響應(請求停止繼續向洋蔥芯穿越)。
詳情參照webman文檔
https://www.workerman.net/doc/webman/middleware.html
下麵是詳細操作
在/config/middleware.php下添加
return [ '' => [ // .... .... app\middleware\ActionHook::class ] ];
然後在app\middleware\文件夾下添加
ActionHook.php
<?php namespace app\middleware; use Webman\MiddlewareInterface; use Webman\Http\Response; use Webman\Http\Request; use Jwt\Jwt; use think\facade\Db; class ActionHook implements MiddlewareInterface { public function process(Request $request, callable $handler) : Response { $action = $request->action; $noAuthArr = ['login','index']; if(!in_array($action,$noAuthArr)){ $head = $request->header(); $checkjwt = Jwt::verifyToken($head['jwt']); $user = DB::name('users')->find($checkjwt['uid']); $request->user_id = $checkjwt['uid']; $request->user = $user; if(empty($checkjwt) || empty($checkjwt['uid']) || empty($checkjwt['token']) ){ return json(['errcode' => -1, 'errmsg' => '登錄驗證失敗']); } // return json(['errcode' => 0, 'errmsg' => 'ok','data'=>$action]); } return $handler($request); } }
這裡引入的jwt 在上篇文章中有說明
當然 使用webman自帶 jwt插件也可