中间件整理
中间件
当一个用户发起请求时:
中间件前置(需要处理的逻辑) -> 执行的方法 -> 中间件后置(对响应数据的处理后并返回相应数据)
使用流程
创建一个中间件(app/Http/Middleware)
php artisan make:middleware CheckAge
<?php namespace App\Http\Middleware; use Closure; class CheckAge { // 处理传入的请求 public function handle($request, Closure $next) { if ($request->age <= 200) { // 如果age小于200重定向到home页面 return redirect('home'); } // 只有前置操作直接 return $next($request); // 进入下一个应用层,并将$request传给下一个应用层 // return $next($request); // 个人觉得后置操作还不如直接使用terminate方法 // 前置+后置的操作 // 获取执行的$next($request)的响应数据。 $response = $next($request); // 处理响应数据,最后返回响应数据 $response->setContent('ddd'); return $response; } // 注意最后响应结果时ddd public function terminate($request, $response){ $response->setContent('ccc'); return $response; } }
注册中间件
app/Http/Kernel.php
注册中间件的类型有三种
$middleware全局中间件,$routeMiddleware为指定路由分配的中间件,$middlewareGroups中间组(就是将多个中间件组合成一个件)<?php namespace App\Http; use Illuminate\Foundation\Http\Kernel as HttpKernel; class Kernel extends HttpKernel { protected $middleware = [ \App\Http\Middleware\TrustProxies::class, \Fruitcake\Cors\HandleCors::class ]; protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class ], 'api' => [ 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], ]; protected $routeMiddleware = [ 'check' => \App\Http\Middleware\CheckAge::class, 'test' => \App\Http\Middleware\TestMiddleware::class, ]; }
为路由指定中间件(全局中间件不需要指定路由)
<?php use Illuminate\Support\Facades\Route; use Illuminate\Http\Request; Route::get('/y20210405',function(Request $request){ return 'aaaa'; })->middleware('check'); Route::get('/test',function(Request $request){ return 'aaaa'; })->middleware('web'); // 通过类名的形式指定 use App\Http\Middleware\CheckAge; Route::get('admin/profile', function () { // })->middleware(CheckAge::class); // withoutMiddleware删除指定中间件 Route::middleware([CheckAge::class])->group(function () { Route::get('/', function () { // }); Route::get('admin/profile', function () { // })->withoutMiddleware([CheckAge::class]); });
其他待续
本作品采用《CC 协议》,转载必须注明作者和本文链接