ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[TOC] # 中间件 ## 定义中间件 ``` $ php artisan make:middleware CheckAge ``` ``` //前置中间件 class BeforeMiddleware { public function handle($request, Closure $next) { // Perform action return $next($request); } } // 后置中间件 class AfterMiddleware { public function handle($request, Closure $next) { $response = $next($request); // Perform action return $response; } } ``` ## 注册中间件 ### 全局中间件 在`app/Http/Kernel.php`中的`$middleware`属性中增加中间件 ### 为路由分配中间件 1、在`app/Http/Kernel.php`中的`$routeMiddleware`属性中增加中间件 ``` // 分配一个或多个中间件 Route::get('/', function () { // })->middleware('first'); Route::get('/', function () { // })->middleware('first', 'second'); ``` 2、使用完整的类名分配路由中间件,不需要在`app/Http/Kernel.php`的`$routeMiddleware`属性中定义 ``` use App\Http\Middleware\CheckAge; Route::get('admin/profile', function () { // })->middleware(CheckAge::class); ``` ### 中间件分组 在`app/Http/Kernel.php`中的`$middlewareGroups`属性中设置 ``` Route::get('/', function () { // })->middleware('diy'); Route::group(['middleware' => ['diy']], function () { // }); ``` ### 中间件顺序 使用`app/Http/Kernel.php`文件的`$middlewarePriority`属性指定中间件优先级 ## 中间件参数 通过冒号隔开中间件名称与中间件参数,多个参数之间使用逗号分隔。 ``` // 中间件获取 public function handle($request, Closure $next, $role, $param) { if (! $request->user()->hasRole($role)) { // Redirect... } return $next($request); } // 定义参数 Route::put('post/{id}', function ($id) { // })->middleware('role:editor,param'); ``` ## Terminable 中间件 [在整个请求周期快要结束的时候调用](https://learnku.com/laravel/t/10802/terminable-middleware) ``` <?php namespace Illuminate\Session\Middleware; use Closure; class StartSession { public function handle($request, Closure $next) { return $next($request); } public function terminate($request, $response) { // Store the session data... } } ```