中介軟體
當一個使用者發起請求時:
中介軟體前置(需要處理的邏輯) -> 執行的方法 -> 中介軟體後置(對響應資料的處理後並返回相應資料)
使用流程
建立一箇中介軟體(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 協議》,轉載必須註明作者和本文連結