【Laravel 】異なる名前空間を持つ同じのルーティングを設定するにはprefixを使う

Laravel

Laravel のルーティングでnamespaceが違うだけで同じクラス名だとURLがかぶってしまう問題ありますよね

同じコントローラ名と同じ関数名を持つ2つのコントローラがありますが、異なるnamespaceがあるときのルーティングを解説します。

例えば販売する人と買い手をマッチングするアプリケーションの場合を例にします。

それぞれnamespaceをBuyerとSellerに分けて、どちらもCategoryControllerを持っているとします。

Route::namespace('Seller')->group(function () {
    Route::get('categories', [CategoryController::class, 'index']);
});
Route::namespace('Buyer')->group(function () {
    Route::get('categories', [CategoryController::class, 'index']);
});

これだと生成されるURLはぶつかりますよね。

php artisan route:listで確認してみてください。

こんなときどうするか?

URLを別々にすれば良さそうですよね。

URLに違いを出すにはprefixメソッドを使えばいい!

Route::namespace('Seller')->prefix('seller/')->group(function () {
    Route::get('categories', [CategoryController::class, 'index']);
});
Route::namespace('Buyer')->prefix('buyer/')->group(function () {
    Route::get('categories', [CategoryController::class, 'index']);
});

これやると次のようにURLを分ける事ができます。

http://localhost/seller/categories/show/[:id]

http://localhost/buyer/categories/show/[:id]

これでURLが変わるので、想定したとおり、それぞれの立場向けに画面を作れますね。

 

さらに名前付きルートも分けたいならこうします。

Route::namespace('Seller')->prefix('seller/')->name('seller.')->group(function () {
    Route::get('categories', [CategoryController::class, 'index']);
});
Route::namespace('Buyer')->prefix('buyer/')->name('buyer.')->group(function () {
    Route::get('categories', [CategoryController::class, 'index']);
});

こうするとコントローラやbladeでURLを設定するときに route('seller.categories.index')のようにルーティングに名前を指定できます。

ゴリゴリとURLのパスを書くのもいいんですが、保守性悪くなるからね。

 

Laravel公式リファレンスはこちら。

https://laravel.com/api/9.x/Illuminate/Routing/Route.html#method_prefix

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