Laravel6のマルチドメインで、メールアドレス認証でリダイレクト先がコントロールできない場合

またも、マルチドメインで、メールアドレス認証時のエラー同様に課題に直面。

$this->middleware('verified');

こんな感じで、認証エラーを検出した場合、マルチドメイン運用だと、片方のドメインに遷移先が固定化されてしまいますので、解消していきます。

middlewareを確認

'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,

このようにEnsureEmailIsVerified::classに定義されています。

EnsureEmailIsVerified::classを確認

    public function handle($request, Closure $next, $redirectToRoute = null)
    {
        if (! $request->user() ||
            ($request->user() instanceof MustVerifyEmail &&
            ! $request->user()->hasVerifiedEmail())) {
            return $request->expectsJson()
                    ? abort(403, 'Your email address is not verified.')
                    : Redirect::route($redirectToRoute ?: 'verification.notice');
        }

        return $next($request);
    }

はい、バリバリいましたね。

認証エラー時に、redirectToRoute が通常 null でやってくるので ‘verification.notice’ のルートにリダイレクトしてますね。

こちらの件、同様に、routes/web.php内に、verification.noticeが複数ある場合、最後のルートが有効になっているみたいです。

解決方法

ミドルウェアなので、 [ EnsureEmailIsVerified.php ]を[ app/Http/Middleware ]なんかにコピーして編集、独自のミドルウェアを登録する。といったアプローチが一般的ですが、今回の場合は、もっと簡単に解決できます。

そもそも、引数で、$redirectToRoute を受け取れるようになっていますので、

$this->middleware('verified:verification.notice.hogehoge');

こんな感じで、独自のルート名を渡してあげるだけ。

Route::get('email/verify', 'Auth\VerificationController@show')->name('verification.notice.hogehoge');

このように任意で命名されたオリジナルのルートにリダイレクトしてくれます。