👨👩👧👦
Laravelのルート名にプレフィックスを付ける
はじめに
マニュアルにも書いてあったりしますが、
ルート名にプレフィックスを付けるやり方もあるって
紹介したら案外知られていなかったので豆知識として記事にしておきます。
環境
- PHP 8.2.10
- Laravel 10.24.0
ルート名にプレフィックスを付けてみる
こんな感じで書いていたものを
use Illuminate\Support\Facades\Route;
Route::get('/welcome1', function () {
return 'welcome1';
})->name('prefix.welcome1');
Route::get('/welcome2', function () {
return 'welcome2';
})->name('prefix.welcome2');
次のように書き換えることができる。
use Illuminate\Support\Facades\Route;
Route::name('prefix.')->group(function () {
Route::get('/welcome1', function () {
return 'welcome1';
})->name('welcome1');
Route::get('/welcome2', function () {
return 'welcome2';
})->name('welcome2');
});
たったこれだけです。
ルールとしては必ず末尾の.
文字を指定することくらいですね。
なぜ.
文字指定なのかはdata_get
へルパ関数やArr::get()
メソッドとかで使いやすいとかあるのかな??
ごめんなさい、ここまでは調べていないです。。。
注意事項
一応、気をつけないといけないのは、
Laravel 7.x以降はルート名は一意にする必要があるのでプレフィックスを付ける場合はそれぞれのルートにも名前を付けないといけないです。
なので、次のようなコードを書くとroute:cache
コマンドで怒られます。
use Illuminate\Support\Facades\Route;
Route::name('prefix')->group(function () {
Route::get('/welcome1', function () {
return 'welcome1';
});
Route::get('/welcome2', function () {
return 'welcome2';
});
});
$ php artisan route:cache
LogicException
Unable to prepare route [welcome2] for serialization. Another route has already been assigned name [prefix].
at vendor/laravel/framework/src/Illuminate/Routing/AbstractRouteCollection.php:247
243▕ $route->name($this->generateRouteName());
244▕
245▕ $this->add($route);
246▕ } elseif (! is_null($symfonyRoutes->get($name))) {
➜ 247▕ throw new LogicException("Unable to prepare route [{$route->uri}] for serialization. Another route has already been assigned name [{$name}].");
248▕ }
249▕
250▕ $symfonyRoutes->add($route->getName(), $route->toSymfonyRoute());
251▕
+18 vendor frames
19 artisan:35
Illuminate\Foundation\Console\Kernel::handle()
あと、route
へルパ関数を使って、ルート名からurlを取得する際に意図したものが取れないケースもあると思います。
$ php artisan tinker
Psy Shell v0.11.21 (PHP 8.2.10 — cli) by Justin Hileman
> route('prefix');
= "http://localhost/welcome2"
上記のコードでroute
へルパ関数を使ってurlを取ってみた例を見ると、最後に定義したurlが取れるようです。
まとめ
ルート名にプレフィックスを付ければ各ルート名に付ける名前が少し短くなります程度なものだと個人的に思います。
寧ろルート名に名前を付け忘れて名前が重複してroute:cache
コマンドで怒られたりするならプレフィックス使わない方が良いかもしれないですね。
まぁご利用は計画的にってことですね。
Discussion