#名前付きルートとは
名前付きルートは特定のルートへのURLを生成したり、リダイレクトしたりする場合に便利です。ルート定義にnameメソッドをチェーンすることで、そのルートに名前がつけられます。
(公式より)
ルート定義に名前を付ければ、命名したルート名を指定することでURLの呼び出しができます。
つまり、コントローラーやビューの中でURLを呼び出すときは直にパスを書く必要はありません。ルート名を指定することでURLを呼び出すことができます。
#使い方
名前付きルートの設定、呼び出しの方についてまとめました。
##名前付きルートの設定
かなりシンプルです。各ルート定義の行末にnameメソッドでルート名を付けるだけです。
(※ルート名は一意である必要があります)
// ルート名の書き方
Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
Route::get('/user/{id}/profile', [App\Http\Controllers\UserProfileController::class, 'show'])->name('profile.show');
Route::post('/user/{id}/profile', [App\Http\Controllers\UserProfileController::class, 'create'])->name('profile.create');
設定が出来たら、あとは呼び出し側でルート名を指定します。
##Controllerで名前付きルートの呼び出し
// URLの生成
$url = route('home');
// リダイレクトの生成
return redirect()->route('profile.show', ['id' => 1]);
名前付きルートでパラメータを定義している場合は、route
関数の第2引数でパラメーターを指定する必要があります。指定されたパラメーターは自動的にURLの正しい場所へ埋め込まれます。
##Viewで名前付きルートの呼び出し
// formでのルート指定
<form method="post" action="{{ route('profile.create', ['id' => 1]) }}">
// hrefでのルート指定
<a href="{{ route('profile.show', ['id' => 1]) }}">プロフィールを見る</a>
##注意点
注意すべき点は、ルート名は常に一意である必要があります。
重複があると、あとに命名されたルートが優先されてしまいます。
// 重複のあるルート
Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('profile');
Route::get('/user/{id}/profile', [App\Http\Controllers\UserProfileController::class, 'show'])->name('profile');
// リダイレクトでルート名を呼び出し
return redirect()->route('profile');
この場合、リダイレクトで呼ばれるルートは
Route::get('/user/{id}/profile', [App\Http\Controllers\UserProfileController::class, 'show'])->name('profile')
になります。呼び出しの時にパラメータを渡していないので、エラーが生じます。
#メリット
名前付きルートを利用するメリットは挙げてみました。
- URLを指定する時に、長々とパスを書く必要がなくなりますのでタイプミスを回避できます。
- パス変更があっても、変更箇所はルート定義ファイルの
web.php
のみ。影響範囲が小さく済みます。