ThinkPHP6項目基操(14.實戰部分 中間件處理登陸流程)

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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索