### 中間件處理登錄流程
* 一、定義中間件
* 二、前置/后置中間件
* 三、注冊中間件
* * 1\. 全局中間件
* 2\. 應用中間件
* 3\. 路由中間件
* 4\. 控制器中間件
* 5\. 內置中間件
* 四、中間件使用 -- 后臺登錄頁面跳轉流程
* * 1\. 創建Auth中間件
* 2\. 注冊應用中間件
# 一、定義中間件
~~~php
<?phpnamespace 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
<?phpnamespace app\middleware;class Before
{public function handle($request, \Closure $next){// 添加中間件執行代碼return $next($request);}
}
~~~
下面是一個后置行為的中間件:
~~~php
<?phpnamespace app\middleware;class After
{public function handle($request, \Closure $next){$response = $next($request);// 添加中間件執行代碼return $response;}
}
~~~
# 三、注冊中間件
新版的中間件分為`全局中間件`、`應用中間件(多應用模式下有效)`、`路由中間件`以及`控制器中間件`四個組。執行順序分別為:
> 全局中間件->應用中間件->路由中間件->控制器中間件
## 1\. 全局中間件
全局中間件在`app`目錄下面`middleware.php`文件中定義,使用下面的方式:
~~~php
<?phpreturn [\app\middleware\Auth::class
];
~~~
中間件的注冊應該使用完整的類名,如果已經定義了中間件別名(或者分組)則可以直接使用。全局中間件的執行順序就是定義順序。
## 2\. 應用中間件
如果你使用了多應用模式,則支持應用中間件定義,你可以直接在應用目錄下面增加`middleware.php`文件,定義方式和全局中間件定義一樣,只是只會在該應用下面生效。
## 3\. 路由中間件
最常用的中間件注冊方式是注冊路由中間件:
~~~php
Route::rule('hello/:name','hello')->middleware(\app\middleware\Auth::class);
~~~
支持注冊多個中間件:
~~~php
Route::rule('hello/:name','hello')->middleware([\app\middleware\Auth::class, \app\middleware\Check::class]);
~~~
## 4\. 控制器中間件
支持為控制器定義中間件,只需要在控制器中定義`middleware`屬性,例如:
~~~php
<?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`文件中、路由或者控制器中定義這些中間件,如果不需要使用的話,取消定義即可。
# 四、中間件使用 – 后臺登錄頁面跳轉流程

當訪問后臺主頁的時候,如果已經登錄(已記錄session)則可以進入注意,否則返回登錄頁面;若訪問后臺登錄頁面,如果已經登錄(已記錄session)則直接跳轉到主頁,否則進入登錄頁面。
## 1\. 創建Auth中間件
在`admin`應用文件夾創建`middleware`文件夾,創建`Auth.php`中間件文件:
~~~php
<?phpnamespace 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
<?php
return ['session_admin' => 'adminUser'
];
~~~
## 2\. 注冊應用中間件
在`admin`應用目錄新建`middleware.php`:
~~~php
<?php
return [\think\middleware\SessionInit::class,app\admin\middleware\Auth::class
];
~~~
- 空白目錄
- 使用thinkphp6搭建后端api接口流程
- tp6 uniapp vue 前后端跨域解決方案
- 操作記錄
- api00
- 你看看有沒有用
- 6666
- Docker安裝LNMP環境的詳細過程(可部署TP項目)
- LNMP部署thinkphp
- 玩客云Armbian 安裝LNMP環境 Docker
- ThinkPHP6項目基操(16.實戰部分 redis+token登錄)
- ThinkPHP6項目基操(11.實戰部分 部署后臺靜態頁面模板及后臺登錄頁面)
- ThinkPHP6項目基操(13.實戰部分 項目中的自定義異常處理總結 錯誤頁面API錯誤)
- ThinkPHP6項目基操(14.實戰部分 中間件處理登錄流程)
- ThinkPHP6項目基操(12.實戰部分 驗證碼)
- ThinkPHP6項目基操(18.實戰部分 表單令牌Token 防CSRF)
- ThinkPHP6項目基操(19.實戰部分 Mysql模型事務操作)
- ThinkPHP6項目基操(20.實戰部分 數據庫操作返回值總結)
- 瀏覽器端判斷當前設備的運行環境
- api
- api異常捕捉
- 寫一個中間件
- 統一的參數返回形式
- ThinkPHP6調用模型的方法
- thinkphp6控制器、驗證器、模型、service,各層寫的內容