HTTP 中介層提供一個方便的機制來過濾進入應用程式的 HTTP 請求。例如,Laravel 本身使用中介層來檢驗使用者身份驗證。如果使用者未經過身份驗證,中介層會將用戶導向登入頁面,反之,當用戶通過身份驗證,中介層將會同意此請求繼續往前進。
當然,除了身份驗證之外,中介層也可以被用來執行各式各樣的任務,CORS 中介層負責替所有即將離開程式的回應加入適當的標頭。而日誌中介層可以記錄所有傳入應用程式的請求。
Laravel 框架已經內建一些中介層,包括維護、身份驗證、CSRF 保護,等等。所有的中介層都放在 app/Http/Middleware 目錄內。
以上為官方的中文內容
會有人好奇如果是這樣Controllers和Middleware 某方面不是一樣,都是在送至頁面前針對所攜帶的資料進行加工。
的確,實際上兩者所做的事情是一樣的,差別在於Controllers進行的是從請求到產生回應這當中每階段要做的事情
Middleware執行的是僅僅是其中的一部份,文件提到的範例 維護、身份驗證、CSRF 保護等,至於要如何使用要設計得看團隊的規範。
簡單的中介層範例
用artisan來產出我們新建立的Middleware
php artisan make:middleware OldMiddleware
<?php
namespace App\Http\Middleware;
use Closure;
class OldMiddleware
{
public function handle($request, Closure $next)
{
if ($request->input('age') <= 200) {
return redirect('home');
}
return $next($request);
}
//傳給客戶端之後再執行
public function terminate($request, $response)
{
// 儲存 session 資料...
}
}
?>
Middleware可以在回應前請求前或回應後執行
<?php
namespace App\Http\Middleware;
use Closure;
class BeforeMiddleware
{
public function handle($request, Closure $next)
{
// 執行動作
return $next($request);
}
}
class AfterMiddleware
{
public function handle($request, Closure $next)
{
$response = $next($request);
// 執行動作
return $response;
}
}
?>
全域中介層,可以將middleware寫在kernel內,就可以利用middleware方法來呼叫
<?php
// 在 App\Http\Kernel 類別內...
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];
?>
如何使用
<?php
Route::get('admin/profile', ['middleware' => 'auth', function () {
//
}]);
Route::get('/', ['middleware' => ['first', 'second'], function () {
//
}]);
?>