close

使用時機:身分驗證、規則驗證、前端防衛機制。

使用好處:1. 不用把所有驗證功能都寫在 Controller   2. 預設加入 CSRF Token 的檢查, 能防止 CSRF 攻擊

 


 

Middleware 可以一個, 也可以多個, 也可以在路由的定義之後鏈結Middleware 方法

1. 一個

Route::get('admin/profile', ['middleware' => 'auth', function () {
    //
}]);

2. 多個

Route::get('/', ['middleware' => ['first', 'second'], function () {
    //
}]);

3. Middleware 方法

Route::get('/', function () {
    //
}])->middleware(['first', 'second']);

 

Middleware 可以去 app\Http\kernel 檔查看, middlewareGroups 有 web 與api 

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
    ],

    'api' => [
        'throttle:60,1',
        'auth:api',
    ],
];

 

中介層群組可以使用與單一中介層一樣的語法指派給路由及控制器行為。同樣的,中介層群組只是讓一次指派多個中介層置路由更方便

雖然 Middleware 只有 web, 但是裡面包含了 EncryptCookies、StartSession、VerifyCsrfToken 等多個 Middleware , 可查看上方$middlewareGroups 中 web 陣列, 裡面所包含的都是 Middleware!

Route::group(['middleware' => ['web']], function () {
    //
});

 

middleware 可自行創建

1. 在Kernel 註冊

至於要放在$routeMiddleware 或是 $middlewareGroups 都可以

2.artisan 新增

php artisan make:middleware name

在 app\Http\Middleware 中會有新增的 Middleware

 

Middleware 還有分處理請求前執行和後執行一些任務

1. 處理請求前

class BeforeMiddleware
{
    public function handle($request, Closure $next)
    {
        // 執行動作

        return $next($request);
    }
}

2. 處理請求後

class AfterMiddleware
{
    public function handle($request, Closure $next)
    {
        $response = $next($request);

        // 執行動作

        return $response;
    }
}

 

※Route.php 內建就會把每個 Route 自動引入 Web Middleware , 所以一般我們不用引入 web middleware 就可以使用 session 和 CSRF token 保護機制

練習: 寫一個登入認證的 middleware, 並用來驗證使用者是否有登入, 若沒有登入, 則返回登入頁面。

 

參考資料:

https://laravel.tw/docs/5.2/middleware

arrow
arrow
    文章標籤
    middleware Laravel HTTP
    全站熱搜

    Mayuge 發表在 痞客邦 留言(0) 人氣()