鍍金池/ 教程/ PHP/ HTTP 中間件
Laravel Cashier
Eloquent ORM
HTTP 響應(yīng)
發(fā)行說明
擴展包開發(fā)
HTTP 控制器
事件
擴展框架
Contracts
開發(fā)
配置
表單驗證
錯誤與日志
Hashing
貢獻(xiàn)指南
郵件
Session
遷移與數(shù)據(jù)填充
查詢構(gòu)造器
Redis
升級向?qū)?/span>
概覽
緩存
服務(wù)提供者
Envoy 任務(wù)執(zhí)行器
隊列
單元測試
服務(wù)容器
文件系統(tǒng) / 云存儲
認(rèn)證
請求的生命周期
加密
模板
視圖 (View)
Laravel Homestead
Laravel 安裝指南
介紹
Command Bus
分頁
輔助方法
應(yīng)用程序結(jié)構(gòu)
HTTP 路由
HTTP 請求
基本用法
本地化
HTTP 中間件
結(jié)構(gòu)生成器
Facades
Laravel Elixir

HTTP 中間件

簡介

HTTP 中間件提供一個方便的機制來過濾進(jìn)入應(yīng)用程序的 HTTP 請求,例如,Laravel 默認(rèn)包含了一個中間件來檢驗用戶身份驗證,如果用戶沒有經(jīng)過身份驗證,中間件會將用戶導(dǎo)向登錄頁面,然而,如果用戶通過身份驗證,中間件將會允許這個請求進(jìn)一步繼續(xù)前進(jìn)。

當(dāng)然,除了身份驗證之外,中間件也可以被用來執(zhí)行各式各樣的任務(wù),CORS 中間件負(fù)責(zé)替所有即將離開程序的響應(yīng)加入適當(dāng)?shù)捻憫?yīng)頭,一個日志中間件可以記錄所有傳入應(yīng)用程序的請求。 Laravel 框架已經(jīng)內(nèi)置一些中間件,包括維護(hù)、身份驗證、CSRF 保護(hù),等等。所有的中間件都位于 app/Http/Middleware 目錄內(nèi)。

建立中間件

要建立一個新的中間件,可以使用 make:middleware 這個 Artisan 命令:

php artisan make:middleware OldMiddleware

此命令將會 在 app/Http/Middleware 目錄內(nèi)置立一個名稱為 OldMiddleware 的類。在這個中間件內(nèi)我們只允許 年齡 大于 200 的才能訪問路由,否則,我們會將用戶重新導(dǎo)向 「home」 的 URI 。

<?php namespace App\Http\Middleware;

class OldMiddleware {

    /**
     * Run the request filter.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($request->input('age') < 200)
        {
            return redirect('home');
        }

        return $next($request);
    }

}

如你所見,若是 年齡 小于 200 ,中間件將會返回 HTTP 重定向給客戶端,否則,請求將會進(jìn)一步傳遞到應(yīng)用程序。只需調(diào)用帶有 $request$next 方法,即可將請求傳遞到更深層的應(yīng)用程序(允許跳過中間件) HTTP 請求在實際碰觸到應(yīng)用程序之前,最好是可以層層通過許多中間件,每一層都可以對請求進(jìn)行檢查,甚至是完全拒絕請求。

Before / After 中間件

在一個請求前后指定某個中間件取決于這個中間件自身。這個中間件可以執(zhí)行在請求前執(zhí)行一些 前置 操作:

<?php namespace App\Http\Middleware;

class BeforeMiddleware implements Middleware {

    public function handle($request, Closure $next)
    {
        // Perform action

        return $next($request);
    }
}

然后,這個中間件也可以在請求后執(zhí)行一些 后置 操作:

<?php namespace App\Http\Middleware;

class AfterMiddleware implements Middleware {

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

        // Perform action

        return $response;
    }
}

注冊中間件

全局中間件

若是希望中間件被所有的 HTTP 請求給執(zhí)行,只要將中間件的類加入到 app/Http/Kernel.php$middleware 屬性清單列表中。

指派中間件給路由

如果你要指派中間件給特定的路由,你得先將中間件在 app/Http/Kernel.php 配置一個鍵值,默認(rèn)情況下,這個文件內(nèi)的 $routeMiddleware 屬性已包含了 Laravel 目前配置的中間件,你只需要在清單列表中加上一組自定義的鍵值即可。 中間件一旦在 HTTP kernel 文件內(nèi)被定義,你即可在路由選項內(nèi)使用 middleware 鍵值來指派:

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

可終止中間件

有些時候中間件需要在 HTTP 響應(yīng)已被發(fā)送到用戶端之后才執(zhí)行,例如,Laravel 內(nèi)置的 「session」 中間件,保存 session 數(shù)據(jù)是在響應(yīng)已被發(fā)送到用戶端 之后 才執(zhí)行。為了做到這一點,你需要定義中間件為「可終止的」。

use Illuminate\Contracts\Routing\TerminableMiddleware;

class StartSession implements TerminableMiddleware {

    public function handle($request, $next)
    {
        return $next($request);
    }

    public function terminate($request, $response)
    {
        // Store the session data...
    }

}

如你所見,除了定義 handle 方法之外, TerminableMiddleware 定義一個 terminate 方法。這個方法接收請求和響應(yīng)。一旦定義了 terminable 中間件,你需要將它增加到 HTTP kernel 文件的全局中間件清單列表中。

上一篇:Laravel 安裝指南下一篇:加密