[Laravel 5.5] リダイレクト専用ルーティング

Laravel 5.5 LTS からルート専用ルーティング Route::redirectが使用可能になりました。これにより、リダイレクトのためだけにわざわざコントローラーにメソッドを生やしたりする必要がなくなり、URL変更時のリダイレクトなどが容易になりました。

Syntax

使い方

使用上の注意

$destinationはURIでのみ指定でき、ルート名での指定は出来ない。

Route::redirect('hoge', route('fuga')) のようにでも出来ればいいところだが、この時点ではまだ登録が未完了なため Route [fuga] not defined. となってしまう。(RouterはMacroableなので結局それが必要ならマクロはやしたほうがいいのか……)

内部実装

vendor/laravel/framework/src/Illuminate/Routing/Router.php:215

vendor/laravel/framework/src/Illuminate/Routing/RedirectController.php

といった専用のコントローラーをfw側に用意し、それを呼び出すルートとして登録している。

バックポート

上記のような単純な構成になっているため、同内容をマクロとして登録してやることで以前のバージョンのLaravelでも同様の記法が使える。(また、揃えておけば5.5アップデート時にそのままFWのRoute::redirectを使えるので便利)

登録例:

適当な箇所 (RouteServiceProvider::bootなど)でmacroを登録

対応するControllerを作成 (ここではRedirectController)

(Route::group内でベース名前空間が変わったりしても問題ないようフルの名前空間使用&__invokeを使用している)

応用

上記バックポートを少し改造することでルート名でリダイレクトを設定することも可能。(といってもURLに含まれるパラメタをリダイレクトに含みたいときはコントローラー生やしたほうが良さそう。)

これにより Route::redirectRoute('/from', 'welcome', [], 302);のようなSyntaxで名前付きルートへのリダイレクトが設定できる。


Official doc: Routing#Redirect Routes

コメントを残す