MUGIJIRU.JP

Webエンジニアの雑談ブログ

Laravel5.3からのMiddlewareの実行順

Laravel5.3以降でMiddlewareの動きが変わっていたのに今更気づいたので
備忘録として残しておきます。

Middlewareの実行順をKernel.phpのプロパティで明示できるようになった。

今までは単純に定義順だったと思いますが、これを調整するためのプロパティが
/Illuminate/Foundation/Http/Kernel.phpに、「$middlewarePriority」で定義されました。

デフォルトはこんな感じ

<?php
    /**
     * 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,
    ];


ここに明示したファイルはmiddlewareGroupsにおいて定義順に最優先で実行されるようになります。
App/Http/Kernel.phpでオーバーライドして利用可能です。

(おまけ) Route Model Bindingを実行する処理がMiddlewareとして独立した。

タイミングを調整できるようになったようです。

/Illuminate/Routing/Middleware/SubstituteBindings.phpというMiddlewareが増えています。

    • -

気づいた経緯としては
「URLによってRoute Model Bindingされた値を見つつセッションのcookie_nameを調整する」
といった特殊なことをやろうとすると、Sessionが生成される前にcookie関連のconfigを弄らなければならないのですが
5.4のソースで適用しようとしたとき、今までやっていた手法ではRoute Model Bindingが行われておらず
cookie_nameを書き換えても反映されないという踏んだり蹴ったりな挙動になっていて、ソースを掘ってみたら
この二つの処理を見つけた・・・という感じです。

柔軟になったとは思いますがDocにも見当たらないものなのでちょっとびっくりしました。