中間件處理登陸流程
1、定義中間件
<?php namespace app\middleware; class Check { public function handle($request, \Closure $next) { if ($request->param('name') == 'think') { return redirect('index/think'); } return $next($request); } }
中間件類能夠隨意命名,中間件的入口執行方法必須是handle
方法,並且第一個參數是Request
對象,第二個參數是一個閉包
。php
2、前置/後置中間件
中間件是在請求具體的操做以前仍是以後執行,徹底取決於中間件的定義自己。
下面是一個前置行爲的中間件:web
<?php namespace app\middleware; class Before { public function handle($request, \Closure $next) { // 添加中間件執行代碼 return $next($request); } }
下面是一個後置行爲的中間件:跨域
<?php namespace app\middleware; class After { public function handle($request, \Closure $next) { $response = $next($request); // 添加中間件執行代碼 return $response; } }
3、註冊中間件
新版的中間件分爲全局中間件
、應用中間件(多應用模式下有效)
、路由中間件
以及控制器中間件
四個組。執行順序分別爲:緩存
全局中間件->應用中間件->路由中間件->控制器中間件session
1. 全局中間件
全局中間件在app
目錄下面middleware.php
文件中定義,使用下面的方式:閉包
<?php return [ \app\middleware\Auth::class ];
中間件的註冊應該使用完整的類名,若是已經定義了中間件別名(或者分組)則能夠直接使用。全局中間件的執行順序就是定義順序。app
2. 應用中間件
若是你使用了多應用模式,則支持應用中間件定義,你能夠直接在應用目錄下面增長middleware.php
文件,定義方式和全局中間件定義同樣,只是只會在該應用下面生效。svg
3. 路由中間件
最經常使用的中間件註冊方式是註冊路由中間件:url
Route::rule('hello/:name','hello')->middleware(\app\middleware\Auth::class);
支持註冊多箇中間件:spa
Route::rule('hello/:name','hello')->middleware([\app\middleware\Auth::class, \app\middleware\Check::class]);
4. 控制器中間件
支持爲控制器定義中間件,只須要在控制器中定義middleware
屬性,例如:
<?php namespace app\controller; class Index { protected $middleware = ['auth']; public function index() { return 'index'; } public function hello() { return 'hello'; } }
當執行index控制器的時候就會調用auth
中間件,同樣支持使用完整的命名空間定義。
5. 內置中間件
中間件類 | 描述 |
---|---|
think\middleware\AllowCrossDomain | 跨域請求支持 |
think\middleware\CheckRequestCache | 請求緩存 |
think\middleware\LoadLangPack | 多語言加載 |
think\middleware\SessionInit Session | 初始化 |
think\middleware\FormTokenCheck | 表單令牌 |
這些內置中間件默認都沒有定義,你能夠在應用的middleware.php
文件中、路由或者控制器中定義這些中間件,若是不須要使用的話,取消定義便可。
4、中間件使用 – 後臺登陸頁面跳轉流程
當訪問後臺主頁的時候,若是已經登陸(已記錄session)則能夠進入注意,不然返回登陸頁面;若訪問後臺登陸頁面,若是已經登陸(已記錄session)則直接跳轉到主頁,不然進入登陸頁面。
1. 建立Auth中間件
在admin
應用文件夾建立middleware
文件夾,建立Auth.php
中間件文件:
<?php namespace app\admin\middleware; use think\Response; class Auth { public function handle($request, \Closure $next){ // 前置中間件 if(empty(session(config("admin.session_admin"))) && !preg_match("/login/",$request->pathinfo()) ){ return redirect(url('login/index')); } if(!empty(session(config("admin.session_admin"))) && preg_match("/login\/index/",$request->pathinfo())){ return redirect(url('index/index')); } $response = $next($request); // 後置中間件 return $response; } public function end(Response $response){ } }
admin.session_admin
是在admin/config文件夾下配置文件定義的:
admin/config/admin.php
<?php return [ 'session_admin' => 'adminUser' ];
2. 註冊應用中間件
在admin
應用目錄新建middleware.php
:
<?php return [ \think\middleware\SessionInit::class, app\admin\middleware\Auth::class ];
本文同步分享在 博客「zy1281539626」(CSDN)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。