Laravelのroute()関数でURLを生成する方法を完全解説!初心者でもわかるルーティングの基本
生徒
「LaravelでURLを直接べた書きしているんですが、もっと便利な方法はありますか?」
先生
「Laravelにはroute()という便利な関数があって、URLを名前で呼び出せるようになっています。」
生徒
「名前でURLを呼び出す?どういうことですか?」
先生
「たとえばお気に入りのお店に『いつものお店』というニックネームをつけておけば、住所を覚えなくてもいいですよね。それと同じで、URLにあだ名をつけておけば、あとから呼び出せるんです。」
生徒
「なるほど!それは便利そうです。具体的に教えてください。」
先生
「では、基本から順番に見ていきましょう!」
1. route()関数とは?LaravelのURLヘルパーの基本
Laravelのroute()関数は、名前付きルート(Named Route)と呼ばれる仕組みを使って、URLを生成するためのヘルパー関数です。
ヘルパー関数とは、よく使う処理をかんたんに呼び出せるように、Laravelがあらかじめ用意してくれている便利な関数のことです。
たとえばウェブサイトを作るとき、ページのURLを直接コードに書いてしまうと、あとでURLを変更したくなったときに、すべての箇所を書き直さなければなりません。
しかしroute()関数を使えば、URLに名前をつけておき、その名前だけを使ってURLを取得できます。
URLが変わっても名前さえ変えなければ、コードを修正する場所は一か所だけで済みます。これが保守性(メンテナンスのしやすさ)が高いとされる理由です。
たとえば郵便局を「いつも荷物を出す場所」と覚えておけば、郵便局が移転しても「いつもの場所」という概念は変わらないのと同じイメージです。
2. 名前付きルートの設定方法(routes/web.php)
route()関数を使うには、まずルート(Route)に名前をつける必要があります。
ルートとは、「どのURLにアクセスしたとき、どの処理を実行するか」を定義した設定のことです。
Laravelではroutes/web.phpというファイルでルートを管理しています。
名前をつけるには、ルートの末尾に->name('名前')を追加します。以下の例を見てください。
// routes/web.php
use Illuminate\Support\Facades\Route;
// トップページのルートに「home」という名前をつける
Route::get('/', function () {
return view('home');
})->name('home');
// お問い合わせページのルートに「contact」という名前をつける
Route::get('/contact', function () {
return view('contact');
})->name('contact');
このように->name('home')と書くことで、/というURLに「home」という名前がつきます。
->name('contact')と書けば/contactに「contact」という名前がつきます。
名前はわかりやすい英語の文字列であれば自由につけられます。ただし、プロジェクト内で重複しないようにする必要があります。
3. route()関数の基本的な使い方
名前付きルートが設定できたら、route()関数を呼び出すだけでURLが生成されます。
PHPのコードの中でも、Bladeテンプレート(LaravelのHTML用テンプレートエンジン)の中でも使えます。
Bladeテンプレートとは、LaravelでHTMLページを作るときに使うファイルのことで、拡張子が.blade.phpになっています。
以下はBladeテンプレートの中でリンクを作る例です。
<!-- resources/views/layouts/nav.blade.php -->
<nav>
<a href="{{ route('home') }}">トップページ</a>
<a href="{{ route('contact') }}">お問い合わせ</a>
</nav>
{{ }}はBladeの構文で、PHPの値をHTMLに出力するための書き方です。
route('home')を実行すると、設定に応じてhttp://example.com/のような完全なURLが返ってきます。
実際に出力されるHTMLは以下のようになります。
<nav>
<a href="http://example.com/">トップページ</a>
<a href="http://example.com/contact">お問い合わせ</a>
</nav>
このように、URLをハードコーディング(直接書くこと)しなくても、名前から正しいURLが自動的に生成されます。
4. パラメータ付きのURLを生成する方法
ブログ記事の詳細ページなど、URLの一部が動的に変わる場合があります。
たとえば/posts/1や/posts/2のように、記事のIDによってURLが変わるケースです。
このような動的なURL(パラメータ付きURL)もroute()関数で簡単に生成できます。
まずルートにパラメータを含めて定義します。
// routes/web.php
// ブログ記事の詳細ページ({id}がパラメータ)
Route::get('/posts/{id}', function ($id) {
return view('posts.show', ['id' => $id]);
})->name('posts.show');
{id}の部分がパラメータです。ここには記事のID番号などが入ります。
次にroute()関数でこのルートのURLを生成するとき、第二引数(関数に渡す2番目の値のこと)に配列でパラメータを渡します。
引数(ひきすう)とは、関数に渡す値のことです。第一引数はルート名、第二引数はパラメータの配列です。
// PHPコードの中でURLを生成する例
$url = route('posts.show', ['id' => 5]);
echo $url;
http://example.com/posts/5
配列のキーにパラメータ名、値に実際の数値や文字列を指定するだけで、動的なURLが自動で作られます。 記事が100件あっても、IDを変えるだけで全ての記事ページのURLを生成できます。
5. クエリパラメータを含むURLの生成
クエリパラメータとは、URLの末尾に?キー=値の形式で追加される情報のことです。
たとえば検索機能を使ったときの/search?keyword=Laravelのような形です。
インターネットで検索したときにアドレスバーに表示される?q=...がまさにこれです。
route()関数では、ルートに定義されていないパラメータを第二引数の配列に追加すると、自動的にクエリパラメータとして付加されます。
// routes/web.php にルートを定義
Route::get('/search', function () {
return view('search');
})->name('search');
// クエリパラメータ付きのURLを生成
$url = route('search', ['keyword' => 'Laravel', 'page' => 2]);
echo $url;
http://example.com/search?keyword=Laravel&page=2
ルート定義には{keyword}のようなパラメータがないため、配列の値が自動的にクエリパラメータとして処理されます。
検索機能やページネーション(ページ分割機能)を実装するときによく使われる方法です。
6. URLを直接書くのとroute()関数を使う違い
ここで改めて、URLをべた書きすることとroute()関数を使うことの違いを整理しておきましょう。
| 比較ポイント | URLをべた書き | route()関数を使う |
|---|---|---|
| URLを変更したとき | すべての箇所を手直しが必要 | ルート定義だけ変えればOK |
| タイプミスのリスク | 高い(文字列を直接書くため) | 低い(名前で管理するため) |
| コードの読みやすさ | URLが何を指しているか不明確 | 名前から目的が伝わりやすい |
| ドメインの変更対応 | 書き直しが発生する | 自動で対応される |
特にチームで開発している場合や、長期間にわたってシステムを運用する場合には、route()関数を使った管理方法が圧倒的に有利です。
コードの可読性(読みやすさ)と保守性(メンテナンスしやすさ)が大幅に向上します。
Laravelで開発するプロジェクトでは、URLを直接書くことはほとんどなく、基本的にはすべてroute()関数を使うのが一般的なスタイルとされています。
Laravelを学ぶ上での重要な習慣のひとつとして、最初からこの使い方を身につけておきましょう。
7. コントローラーとroute()関数を組み合わせる実践的な例
実際の開発では、ルートにクロージャ(無名関数)を使うのではなく、コントローラーと組み合わせて使うことがほとんどです。
コントローラーとは、ウェブページの処理ロジックをまとめるためのクラス(設計図)のことです。
Laravelでの本格的な開発スタイルに近い形でroute()関数の使い方を確認しましょう。
// routes/web.php(コントローラーを使ったルート定義)
use App\Http\Controllers\PostController;
Route::get('/posts', [PostController::class, 'index'])->name('posts.index');
Route::get('/posts/{id}', [PostController::class, 'show'])->name('posts.show');
Route::get('/posts/create', [PostController::class, 'create'])->name('posts.create');
このようにposts.index、posts.show、posts.createという名前でルートを管理します。
ドット(.)区切りで名前をつけると、どのリソースに関するルートかがわかりやすくなります。
リソースとは、ここでは「投稿(Post)」のようなデータの種類のことです。
Bladeテンプレートで一覧ページと詳細ページへのリンクを作る場合は以下のようになります。
<!-- 記事一覧ページへのリンク -->
<a href="{{ route('posts.index') }}">記事一覧へ</a>
<!-- 記事ID=3の詳細ページへのリンク -->
<a href="{{ route('posts.show', ['id' => 3]) }}">3番の記事を見る</a>
<!-- 記事投稿ページへのリンク -->
<a href="{{ route('posts.create') }}">新しい記事を投稿する</a>
このパターンがLaravelの開発現場で最もよく使われる書き方です。 名前の付け方にも一定のルールを持たせることで、複数人での開発でも混乱が起きにくくなります。
また、フォームの送信先を指定するときにもroute()関数は活躍します。
HTMLのaction属性に直接URLを書くのではなく、route()を使うことでURLの変更に強いフォームを作れます。
このような積み重ねが、保守性の高いLaravelアプリケーション開発につながっていきます。