Laravel框架學習(中介軟體)
1、中介軟體簡介
Laravel中可以把HTTP中介軟體看做“裝飾器”,在請求到達最終動作之前對請求進行過濾和處理。中介軟體在Laravel中有著廣泛的應用,比如使用者認證、日誌、維護模式、開啟Session、從Session中獲取錯誤資訊,CSRF驗證,等等。
中介軟體類預設存放在app/Http/Middleware目錄下。
2、中介軟體使用
自定義中介軟體類只需要定義一個handle方法即可,然後我們將主要業務邏輯定義在該方法中,如果我們想在請求處理前執行業務邏輯,則在$next閉包執行前執行業務邏輯操作:
<?php
namespace App\Http\Middleware ;
use Closure;
class BeforeMiddleware
{
public function handle($request, Closure $next)
{
// 執行業務邏輯操作
return $next($request);
}
}
如果想要在請求處理後執行中介軟體業務邏輯,則在$next閉包執行後執行操作:
<?php
namespace App\Http\Middleware;
use Closure;
class AfterMiddleware
{
public function handle($request, Closure $next)
{
$response = $next($request);
// 執行動作
return $response;
}
}
我們處理的大部分操作都是第一種場景,即在請求處理前執行操作,比如使用者認證、CSRF驗證、維護模式等都是這樣,但也有用到第二種場景的時候,比如StartSession中介軟體,該中介軟體在請求處理前後都有操作,其handle方法如下:
public function handle($request, Closure $next)
{
$this ->sessionHandled = true;
//如果session驅動已配置,那麼我們需要開啟session以便為應用準備好資料
//注意Laravel session並沒有使用原生的PHP session相關方法,因為它們顯得那樣蹩腳
if ($this->sessionConfigured()) {
$session = $this->startSession($request);
$request->setSession($session);
}
$response = $next($request);
// 同樣,如果session經過配置那麼我們需要關閉session以便將session資料持久化到某些儲存介質中
// 我們還會新增session id到響應頭cookie中
if ($this->sessionConfigured()) {
$this->storeCurrentUrl($request, $session);
$this->collectGarbage($session);
$this->addCookieToResponse($response, $session);
}
return $response;
}
此外,定義好中介軟體後,需要在app/Http/Kernel.php檔案中註冊該中介軟體,如果我們定義的中介軟體想要在全域性有效,即每次請求都會呼叫,則將該中介軟體追加到
3、中介軟體引數
除了請求例項
public function handle($request, Closure $next, $gender)
{
if($request->input('age')>=18 && $gender==$request->input('gender')){
return $next($request);
}else{
return redirect()->route('refuse');
}
}
4、定義可終止的中介軟體
可終止的中介軟體是指定義了terminate方法的中介軟體,terminate方法會在一次請求生命週期的末尾執行一些操作。比如StartSession中介軟體定義了該方法,在響應資料傳送到瀏覽器之後將session資料儲存起來。
可終止的中介軟體需要追加到app/Http/Kernel.php類的全域性中介軟體列表即$middleware屬性陣列中。
呼叫中介軟體的terminate方法時,Laravel會從服務容器中取出新的中介軟體例項,所以如果想要呼叫handle方法和terminate方法時使用的是同一個中介軟體例項,需要使用singleton方法將該中介軟體註冊到服務容器。