99re热视频这里只精品,久久久天堂国产精品女人,国产av一区二区三区,久久久精品成人免费看片,99久久精品免费看国产一区二区三区

基礎 ―― HTTP 中間件

2018-02-24 15:38 更新

基礎 —— HTTP 中間件

1、簡介

HTTP。例如,Laravel包含了一個中間件來驗證用戶是否經過授權,如果用戶沒有經過授權,中間件會將用戶重定向到登錄頁面,否則如果用戶經過授權,中間件就會允許請求繼續(xù)往前進入下一步操作。

當然,除了認證之外,中間件還可以被用來處理更多其它任務。比如:CORS中間件可以用于為離開站點的響應添加合適的頭(跨域);日志中間件可以記錄所有進入站點的請求。

Laravel框架內置了一些中間件,包括維護模式中間件、認證、CSRF保護中間件等等。所有的中間件都位于app/Http/Middleware目錄。

2、定義中間件

想要創(chuàng)建一個新的中間件,可以通過Artisan命令make:middleware

php artisan make:middleware OldMiddleware

這個命令會在app/Http/Middleware目錄下創(chuàng)建一個新的中間件類OldMiddleware,在這個中間件中,我們只允許提供的age大于200的訪問路由,否則,我們將用戶重定向到主頁:

<?php

namespace App\Http\Middleware;

use Closure;

class OldMiddleware
{
    /**
     * 返回請求過濾器
     *
     * @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);
    }

}

正如你所看到的,如果age<=200,中間件會返回一個HTTP重定向到客戶端;否則,請求會被傳遞下去。將請求往下傳遞可以通過調用回調函數$next。

理解中間件的最好方式就是將中間件看做HTTP請求到達目標之前必須經過的“層”,每一層都會檢查請求甚至會完全拒絕它。

2.1 中間件之前/之后

一個中間件是否請求前還是請求后執(zhí)行取決于中間件本身。比如,以下中間件會在請求處理前執(zhí)行一些任務:

<?php

namespace App\Http\Middleware;

use Closure;

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

        return $next($request);
    }
}

然而,下面這個中間件則會在請求處理后執(zhí)行其任務:

<?php

namespace App\Http\Middleware;

use Closure;

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

        // 執(zhí)行動作

        return $response;
    }
}

3、注冊中間件

3.1 全局中間件

如果你想要中間件在每一個HTTP請求期間被執(zhí)行,只需要將相應的中間件類放到app/Http/Kernel.php的數組屬性$middleware中即可。

3.2 分配中間件到路由

如果你想要分配中間件到指定路由,首先應該在app/Http/Kernel.php文件中分配給該中間件一個簡寫的key,默認情況下,該類的$routeMiddleware屬性包含了Laravel內置的入口中間件,添加你自己的中間件只需要將其追加到后面并為其分配一個key:

// 在 App\Http\Kernel 里中
protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,];

中間件在HTTP kernel中被定義后,可以在路由選項數組中使用$middleware鍵來指定中間件:

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

4、中間件參數

中間件還可以接收額外的自定義參數,比如,如果應用需要在執(zhí)行動作之前驗證認證用戶是否擁有指定的角色,可以創(chuàng)建一個RoleMiddleware來接收角色名作為額外參數。

額外的中間件參數會在$next參數之后傳入中間件:

<?php

namespace App\Http\Middleware;

use Closure;

class RoleMiddleware
{
    /**
     * 運行請求過濾器
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string  $role
     * @return mixed
     * translator http://laravelacademy.org
     */
    public function handle($request, Closure $next, $role)
    {
        if (! $request->user()->hasRole($role)) {
            // Redirect...
        }

        return $next($request);
    }

}

中間件參數可以在定義路由時通過:分隔中間件名和參數名來指定,多個中間件參數可以通過逗號分隔:

Route::put('post/{id}', ['middleware' => 'role:editor', function ($id) {
    //
}]);

5、可終止的中間件

有時候中間件可能需要在HTTP響應發(fā)送到瀏覽器之后做一些工作。比如,Laravel內置的“session”中間件會在響應發(fā)送到瀏覽器之后將session數據寫到存儲器中,為了實現這個,定義一個可終止的中間件并添加terminate方法到這個中間件:

<?php

namespace Illuminate\Session\Middleware;

use Closure;

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

    public function terminate($request, $response)
    {
        // 存儲session數據...
    }
}

terminate方法將會接收請求和響應作為參數。一旦你定義了一個可終止的中間件,應該將其加入到HTTP kernel的全局中間件列表中。

當調用中間件上的terminate方法時,Laravel將會從服務容器中取出該中間件的新的實例,如果你想要在調用handleterminate方法時使用同一個中間件實例,則需要使用容器的singleton方法將該中間件注冊到容器中。

擴展閱讀:中間件實例教程 —— 中間件的創(chuàng)建使用及中間件參數定義

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號