Laravel 多箇中介軟體的執行順序

realghost發表於2018-07-09

問題

一個路由需要用到多箇中介軟體,其中一個是 Laravel 自帶的 auth 中介軟體。

發現這個中介軟體不管放在哪裡,總是在自定義中介軟體之前執行。

如果業務需要自定義中間在 auth 之前執行,還是有辦法的。

解決方案

觀察定義中介軟體的 app\Http\Kernel 類,是繼承的 Illuminate\Foundation\Http\Kernel 類。

再開啟 Illuminate\Foundation\Http\Kernel ,發現有這樣一個陣列

    ...

    /**
     * The priority-sorted list of middleware.
     *
     * Forces the listed middleware to always be in the given order.
     *
     * @var array
     */
    protected $middlewarePriority = [
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \Illuminate\Auth\Middleware\Authenticate::class,
        \Illuminate\Session\Middleware\AuthenticateSession::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
        \Illuminate\Auth\Middleware\Authorize::class,
    ];

    ...

註釋裡寫得比較清楚了:列表中的中介軟體會按照順序優先在其他中介軟體之前執行。

那麼需要自定義中介軟體在 auth 之前執行,只需要在 app\Http\Kernel 過載這個陣列就行了。

auth 中介軟體對應的類 \Illuminate\Auth\Middleware\Authenticate

將自定義中介軟體 \App\Http\Middleware\CustomMiddelware 放到這個前面就可以了:

    ...

    protected $middlewarePriority = [
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\CustomMiddelware::class,
        \Illuminate\Auth\Middleware\Authenticate::class,
        \Illuminate\Session\Middleware\AuthenticateSession::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
        \Illuminate\Auth\Middleware\Authorize::class,
    ];

    ...

擴充

不在 $middlewarePriority 列表中的中介軟體,是按照在路由配置裡呼叫的順序來的:

  • Route::group 裡定義的,先執行外層,後執行內層

  • 在陣列定義的,先執行寫在陣列前面的,後執行寫在陣列後面的

舉例:


Route::group(['middleware' => 'outer'], function () {
    Route::group(['middleware' => 'inner'], function () {
        Route::group(['middleware' => ['array1', 'array2', 'auth:api']], function () {
            Route::get('test', function () {
                return;
            });
        });
    });
});

這裡就是按照 outerinnerarray1array2 的順序執行。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章