1. 程式人生 > >Laravel5.3使用學習筆記---中介軟體

Laravel5.3使用學習筆記---中介軟體

Laravel提供了中介軟體的使用。那什麼是中介軟體呢,根據用法,我總結為,夾在“請求—>控制器—>響應—>end”中間執行的程式碼片段。本文將以官方英文文字為基礎資料進行筆記記錄。
Laravel V5.3 middleware : https://laravel-china.org/docs/en/5.3/middleware

一. 使用入門

本人覺得常用的就是在”請求–>控制器”這個流程中插入中間執行程式碼。
首先,需要建立中介軟體,如:

<?php

namespace App\Http\Middleware;

use Closure;
use
Illuminate\Support\Facades\Auth; class Test { public function handle($request, Closure $next, $guard = null) { echo "this is middleware named test <br/>"; return $next($request); } }

注意這裡需要執行的程式碼放在 handle方法中,該方法的形參中的“$request”是請求類,”$next”是流水線(流水線式laravel框架的一個核心流程概念,有興趣可去看原始碼,裡面的類叫pipeLine)中下一個需要執行的閉包函式。

然後,就是為自己定義的路由註冊中介軟體,在app/Http/Kernel.php中,寫上如下程式碼:
(注意:以下用法中介軟體在控制器例項之後,具體行為之前執行)

protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'guest' => \App\Http\Middleware
\RedirectIfAuthenticated::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'test_mid' => \App\Http\Middleware\Test::class, //在後面新增自己自定義的中介軟體 ];

最後,就是在路由的定義那裡使用middleware方法進行繫結:

Route::get('/', function () {
    return "hello <br/>";
})->middleware('test_mid');

配置完了,當在瀏覽器中輸入如下網址時:

http://Host/

於是,就輸出:

this is middleware named test
hello

二. 結尾中介軟體(Terminable Middleware)

在控制器前可以新增中介軟體,那麼再控制器後也可以新增結尾中介軟體,使用相當簡單,就是在自定義中介軟體裡定義terminate函式,如下:
(注意:以下用法中介軟體在控制器行為之後執行)

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class Test
{
    public function handle($request, Closure $next, $guard = null)
    {
        echo "this is middleware named test <br/>";
        return $next($request);
    }

    public function terminate($request, $response)
    {
        echo "this is terminate middleware named test <br/>";
    }
}

其它步驟和“一”中說的一致,然後輸入網址後,輸出:

this is middleware named test
hello
this is terminate middleware named test 

三. 中介軟體更加靈活的用法

如果希望所有路由都執行同一個自定義中介軟體,就在app/Http/Kernel.php中的middleware 陣列新增自定義項,如:
(注意:以下用法中介軟體在控制器例項化之前執行)

/**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array
     */
    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \App\Http\Middleware\Test::class,
    ];

或者,希望一個路由能夠同時使用多箇中間件,就在app/Http/Kernel.php中的middlewareGroups陣列新增自定義項,如:

protected $middlewareGroups = [
        'testMG' => [
            \App\Http\Middleware\Test::class,
            中介軟體2,
            中介軟體3
        ]
    ];

然後,在路由定義時,如下使用:

Route::get('/', function () {
    return "hello <br/>";
})->middleware('testMG');

或者,希望某個路由在使用中介軟體時,能攜帶一個引數(目前只支援一個字串引數【json時就可以表示物件了】),就要在路由定義時,如下使用:

Route::get('/', function () {
    return "hello <br/>";
})->middleware('test:myParams'); //冒號前就是註冊的中介軟體的名字,冒號後就是引數了

然後,中介軟體的handle函式中,第三個形參,就是用來接收“myParams”這個傳遞過來的字串的。

或者如果想再控制器中定義中介軟體,可以在控制器的建構函式中這樣寫:

class  TestController extends Controller{

    public function __construct()
    {
        $this->middleware('中介軟體名字1');
        $this->middleware('中介軟體名字2');
    }

}