👨‍👩‍👧‍👦

Laravelのルート名にプレフィックスを付ける

2023/09/24に公開

はじめに

マニュアルにも書いてあったりしますが、
ルート名にプレフィックスを付けるやり方もあるって
紹介したら案外知られていなかったので豆知識として記事にしておきます。

https://laravel.com/docs/10.x/routing#route-group-name-prefixes

環境

  • 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以降はルート名は一意にする必要があるのでプレフィックスを付ける場合はそれぞれのルートにも名前を付けないといけないです。
https://laravel.com/docs/7.x/upgrade#unique-route-names

なので、次のようなコードを書くと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());
    244245$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}
    249250$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コマンドで怒られたりするならプレフィックス使わない方が良いかもしれないですね。

まぁご利用は計画的にってことですね。

GitHubで編集を提案

Discussion