中介軟體整理

yaoxs發表於2021-04-05

分享:Laravel 三種中介軟體作用講解

中介軟體

當一個使用者發起請求時:
中介軟體前置(需要處理的邏輯) -> 執行的方法 -> 中介軟體後置(對響應資料的處理後並返回相應資料)

使用流程

建立一箇中介軟體(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 協議》,轉載必須註明作者和本文連結

相關文章