Laravelでの画面遷移には「ルート設定」が欠かせません。そのルートに「名前」を付けることで、URLを意識せずにリンクを作成できるようになります。
例えば、今は /show/{$id} と書いていますが、あとでURLを /contacts/show/{$id} に変更したくなったら、全てのフォームやリンクを探して書き直す必要がありますね?
名前付きルートを使うと、「URLの変更にも柔軟に対応できて」「コードが整理され、保守性も向上」します。
この章では、ルート定義と name() の仕組みを理解しながら、route() ヘルパーでの使い方や、名前付きルートのメリットをわかりやすく整理していきます。
名前付きルートの定義
Laravelでは、ルートに「名前: name() 」を設定しておくことで、コード内で柔軟に使いまわすことができます。
Route::get('/show/{$id}', [ContactController::class, 'store'])->name('show');
->name('show')を作成したルートの後に付けることで、このルートに「show」という名前をつける、と言う意味になります。
これにより、後でリンクを作成するときに、URLではなく名前で指定できるようになります。
名前付きルートを使うと、以下のようにビュー(Blade)テンプレートでリンクを作成できます。
<a href="{{ route('show', $contact->id) }}">詳細</a>
route('show', ...) は、Laravelに「show という名前が付いたルートのURLを生成してね」とお願いする構文になっており、$contact->id は、そのルートに渡すパラメータ(URLの中のID)を表示しています。
なぜ名前付きルートが便利なのか?
ここで、なぜ名前付きのルートが便利なのかまとめておきましょう。
| 発生した問題 | 名前付きルートでの解決 |
|---|---|
| URLが変更されたら全て修正が必要 | route('〇〇') を使えば変更不要 |
| 可読性が低い | 意味が伝わる名前を付けられる (contact.confirm, contact.index など) |
| リンク切れリスク | ルート名の整合性でエラーを検出しやすい |
では実際に実装してみましょう!
1. pullとブランチの作成
まずは、もうそろそろ定着してきた作業ではありませんか?作業に入る前に前回mergeしたメインブランチを更新しておきましょう。
# ブランチをpullする
git pull origin main
以上で完了です。mainブランチが前章で作成されたブランチと同じになれば、次に進みます。
git switch -C change-name
今回はrouteのnameを変更するので、安直ですがchange-nameと言う名前のブランチを作成しました。ブランチ名は任意となりますので、お好きなブランチ名を付けて構いません。
2.web.phpの修正
まずは、これまで作成したすべての route に対して、name をつけていきましょう。
Route::get('/', [ContactController::class, 'index'])->name('index');
Route::get('/show/{id}', [ContactController::class, 'show'])->name('show');
Route::get('/contact', [ContactController::class, 'contact'])->name('contact');
Route::post('/contact/confirm', [ContactController::class, 'confirm'])->name('contact.confirm');
Route::post('/contact/store', [ContactController::class, 'store'])->name('contact.store');
Route::get('/thanks', [ContactController::class, 'thanks'])->name('thanks');
今回はシンプルに index や show とつけていますが、この部分は任意で文字をつけられます。
ですので例えば contact.index とか information.show などをつけても対応する route を設定すればその通りに動きます。
設定し終わったら、すべてのリンクを修正する必要があります。ページ数が多いので一つずつ確認しながら進めていってください。
3.index.blade.phpの修正
<td><a href="{{ route('show', $contact->id) }}">詳細</a></td>
<td><a href="/contacts/{{ $contact->id }}">詳細</a></td>の部分を上記に変更してください。
4.show.blade.phpの修正
<a href="{{ route('index') }}">一覧へ戻る</a>
<a href="/">一覧へ戻る</a>の部分を上記に変更してください。
5.contact.blade.phpの修正
<form action="{{ route('contact.store') }}" method="POST">
<form action="/contact/store" method="POST">の部分を上記に変更してください。
6.thanks.blade.phpの修正
<a href="{{ route('thanks') }}">トップページへ戻る</a>
<a href="/">トップページへ戻る</a>の部分を上記に変更してください。
7.app.blade.phpの修正
最後に共通レイアウトのリンクの修正も行います。
<a href="{{ route('index') }}">トップ</a> |
<a href="{{ route('contact') }}">お問い合わせ</a>
<a href="/">トップ</a> | <a href="/contact">お問い合わせ</a>の部分を上記に変更してください。
8.Git push
以上が完了したら、ここでGitを共有しておきましょう。
git add -A
git commit -m "コメントを入力する"
git push origin make-index
git pushが無事完了したら、GitHub上で操作を行います。
pull requestが来ているので、mergeしましょう。
今回は route() と name() の解説のためにわざわざ最初は name() を設定しておりませんでしたが、通常の開発では最初から name() を決めておくことがほとんどです。
次のアプリであるTwitter風アプリを作成しよう、では最初から name() を付属させておりますので、今回のような全部のページを修正するということはありませんということを、ここで説明させていただきます。