1. 程式人生 > >Laravel框架中簡單使用中介軟體

Laravel框架中簡單使用中介軟體

簡介

HTTP 中介軟體提供一個方便的機制來過濾進入應用程式的 HTTP 請求,例如,Laravel 預設包含了一箇中間件來檢驗使用者身份驗證,如果使用者沒有經過身份驗證,中介軟體會將使用者導向登入頁面,然而,如果使用者通過身份驗證,中介軟體將會允許這個請求進一步繼續前進。

當然,除了身份驗證之外,中介軟體也可以被用來執行各式各樣的任務,CORS 中介軟體負責替所有即將離開程式的響應加入適當的響應頭,一個日誌中介軟體可以記錄所有傳入應用程式的請求。 Laravel 框架已經內建一些中介軟體,包括維護、身份驗證、CSRF 保護,等等。所有的中介軟體都位於 app/Http/Middleware 目錄內。

建立中介軟體

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

php artisan make:middleware privilege(中介軟體名稱)

此命令將會 在 app/Http/Middleware 目錄內建立一個名稱為 privilege的類。在這個中介軟體內我們只允許 年齡 大於 200 的才能訪問路由,否則,我們會將使用者重新導向 「home」 的 URI 。

<?php

namespace App\Http\Middleware;

use Closure;

class privilege{

/**

*Handle an incoming request.

*

*@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 重定向給客戶端,否則,請求將會進一步傳遞到應用程式。只需呼叫帶有 $request 的$

next 方法,即可將請求傳遞到更深層的應用程式(允許跳過中介軟體) HTTP 請求在實際碰觸到應用程式之前,最好是可以層層通過許多中介軟體,每一層都可以對請求進行檢查,甚至是完全拒絕請求。

註冊中介軟體

全域性中介軟體

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

<?php
namespace App\Http;


use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * @var array
     */
    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
    ];

    /**
     * The application's route middleware.
     *
     * @var array
     */
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'privilege' => \App\Http\Middleware\privilege::class,
    ];

}

指派中介軟體給路由

如果你要指派中介軟體給特定的路由,你得先將中介軟體在 app/Http/Kernel.php 配置一個鍵值,預設情況下,這個檔案內的 $routeMiddleware 屬性已包含了 Laravel 目前配置的中介軟體,你只需要在清單列表中加上一組自定義的鍵值即可。 中介軟體一旦在 HTTP kernel 檔案內被定義,你即可在路由選項內使用 middleware 鍵值來指派:

<?php
namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * @var array
     */
    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
    ];

    /**
     * The application's route middleware.
     *
     * @var array
     */
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'privilege' => \App\Http\Middleware\privilege::class,
    ];

}