1. 程式人生 > >Laravel框架學習(中介軟體)

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檔案中註冊該中介軟體,如果我們定義的中介軟體想要在全域性有效,即每次請求都會呼叫,則將該中介軟體追加到middleware使routeMiddleware屬性陣列,並在路由定義時使用middleware選項指定。

3、中介軟體引數
除了請求例項requestnext之外,中介軟體還可以接收額外引數,我們還是以TestMiddleware為例,現在要求年齡在18歲以上的男性才能訪問指定頁面,handle方法定義如下:

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方法將該中介軟體註冊到服務容器。