【第四弾】Laravel入門資料

📚 Laravel公式ドキュメント - Routing

https://laravel.com/docs/12.x/routing

💡 この講座では、上記の公式ドキュメントを基に解説していきます。
公式ドキュメントは初学者には内容が難しいため、エッセンスを優しく噛み砕いて解説していきます。

ルーティングとは

ルーティングとは、URLとプログラムを紐付ける仕組みのことです。 ユーザーが特定のURLにアクセスしたときに、どのプログラム(処理)を実行するかを決定します。

例えば、https://example.com/about にアクセスしたら「会社概要ページ」を表示し、 https://example.com/contact にアクセスしたら「お問い合わせページ」を表示する、 といった振り分けをルーティングが担当します。

ルートファイルの場所

Laravelでは、ルーティングの設定は以下のファイルで行います:

  • routes/web.php - Webページ用のルート(セッション、CSRF保護あり)
  • routes/api.php - API用のルート(Laravel 11以降はデフォルトでは存在しません)

この講座では、routes/web.php を使って解説していきます。

💡 api.php は、API開発が必要になったら php artisan install:api コマンドで作成できます。
今は気にしなくてOKです。

最もシンプルなルーティング

まずは、文字列を返す最もシンプルなルートから見ていきましょう。

// routes/web.php

Route::get('/hello', function () {
    return 'Hello, World!';
});

このコードは以下のように動作します:

  • Route::get() - GETリクエストを処理するルートを定義
  • '/hello' - アクセスするURLのパス
  • function () { ... } - 実行される処理(クロージャ)
  • return 'Hello, World!'; - ブラウザに表示される内容

ブラウザで http://localhost/hello にアクセスすると、 「Hello, World!」という文字列が表示されます。

HTMLを返す

文字列だけでなく、HTMLタグを含む内容も返すことができます。

// routes/web.php

Route::get('/about', function () {
    return '<h1>会社概要</h1><p>私たちは素晴らしい会社です。</p>';
});

ブラウザで http://localhost/about にアクセスすると、 HTMLとして解釈され、見出しと段落が表示されます。

⚠️ ただし、実際の開発では、HTMLをルートに直接書くことはほとんどありません。 次のセクションで説明する「ビュー」を使うのが一般的です。

ビュー(View)を返す

HTMLが複雑になると、ルートファイルに直接書くのは大変です。 そこで、ビュー(View)という仕組みを使います。

// routes/web.php

Route::get('/company', function () {
    return view('company');
});

view('company') は、resources/views/company.blade.php というファイルを読み込んで表示します。

ビューについての詳細は、次の章「ビュー」で詳しく解説します。

動的なルート - パラメータを使う

URLの一部を変数として受け取ることができます。 これをルートパラメータと呼びます。

基本的なパラメータ

// routes/web.php

Route::get('/user/{id}', function ($id) {
    return 'ユーザーID: ' . $id;
});

動作例:

  • /user/1 → 「ユーザーID: 1」
  • /user/100 → 「ユーザーID: 100」
  • /user/abc → 「ユーザーID: abc」

{id} の部分が変数になり、関数の引数 $id として受け取ることができます。

複数のパラメータ

// routes/web.php

Route::get('/post/{category}/{id}', function ($category, $id) {
    return "カテゴリ: {$category}, 記事ID: {$id}";
});

動作例:

  • /post/tech/123 → 「カテゴリ: tech, 記事ID: 123」
  • /post/news/456 → 「カテゴリ: news, 記事ID: 456」

オプションパラメータ

パラメータを省略可能にすることもできます。

// routes/web.php

Route::get('/greeting/{name?}', function ($name = 'ゲスト') {
    return "こんにちは、{$name}さん";
});

動作例:

  • /greeting/太郎 → 「こんにちは、太郎さん」
  • /greeting → 「こんにちは、ゲストさん」

{name?} のように ? を付けると省略可能になり、 関数の引数でデフォルト値を設定できます。

HTTPメソッドの種類

Webアプリケーションでは、用途に応じて異なるHTTPメソッドを使い分けます。

  • Route::get() - データを取得する(ページ表示など)
  • Route::post() - データを送信する(フォーム送信など)
  • Route::put()/patch() - データを更新する
  • Route::delete() - データを削除する
// routes/web.php

// ユーザー一覧を表示
Route::get('/users', function () {
    return 'ユーザー一覧';
});

// ユーザーを新規作成
Route::post('/users', function () {
    return 'ユーザーを作成しました';
});

// ユーザー情報を更新
Route::put('/users/{id}', function ($id) {
    return "ユーザー{$id}を更新しました";
});

// ユーザーを削除
Route::delete('/users/{id}', function ($id) {
    return "ユーザー{$id}を削除しました";
});

💡 初心者の方へ:まずは Route::get() だけを覚えればOKです。 他のメソッドは、フォーム送信やAPIを作る際に必要になります。

ルート名(Named Routes)

ルートに名前を付けることで、後からURLを変更しても影響を受けにくくなります。

ルート名の定義

// routes/web.php

Route::get('/profile', function () {
    return 'プロフィールページ';
})->name('profile');

なぜルート名が必要なのか - 具体例

例えば、複数のページから「プロフィールページ」へのリンクを作る場合を考えてみましょう。

❌ ルート名を使わない場合(非推奨)

// resources/views/dashboard.blade.php
<a href="/profile">プロフィール</a>

// resources/views/header.blade.php
<a href="/profile">マイページ</a>

// app/Http/Controllers/HomeController.php
public function index()
{
    return redirect('/profile');
}

問題点: URLを /profile から /user/profile に変更したい場合、 すべてのファイルを探して修正する必要があります。修正漏れがあるとリンク切れが発生します。

✅ ルート名を使う場合(推奨)

// routes/web.php
Route::get('/profile', function () {
    return 'プロフィールページ';
})->name('profile');

// resources/views/dashboard.blade.php
<a href="{{ route('profile') }}">プロフィール</a>

// resources/views/header.blade.php
<a href="{{ route('profile') }}">マイページ</a>

// app/Http/Controllers/HomeController.php
public function index()
{
    return redirect()->route('profile');
}

メリット: URLを変更したい場合、routes/web.php の1箇所だけ修正すればOKです。

// routes/web.php
// URLを変更しても、他のファイルは修正不要!
Route::get('/user/profile', function () {
    return 'プロフィールページ';
})->name('profile');

パラメータ付きルート名

ルートパラメータがある場合も、ルート名を使うことができます。

// routes/web.php
Route::get('/user/{id}', function ($id) {
    return "ユーザーID: {$id}";
})->name('user.show');

// ビューでの使用例
<a href="{{ route('user.show', ['id' => 1]) }}">ユーザー1</a>
<a href="{{ route('user.show', ['id' => 100]) }}">ユーザー100</a>

// 生成されるURL
// /user/1
// /user/100

ルート名を使うメリット まとめ

  • URLの一元管理 - URLを変更しても1箇所の修正で済む
  • タイポ防止 - IDEの補完が効くため、URLの書き間違いを防げる
  • コードの可読性向上 - route('profile') の方が /user/my-profile より意図が明確
  • リファクタリングが容易 - URL構造を自由に変更できる

💡 実務では、ほとんどのルートに名前を付けるのが一般的です。 今のうちから ->name() を付ける習慣をつけておきましょう。

ルートグループ(Route Group)

複数のルートに共通の設定を適用したい場合、ルートグループを使うと便利です。
実務では、管理画面、API、多言語対応などで頻繁に使われる重要な機能です。

プレフィックス(prefix)でURLをまとめる

管理画面のルートを /admin で統一する例:

// routes/web.php

// ❌ グループを使わない場合(冗長)
Route::get('/admin/dashboard', function () {
    return '管理画面ダッシュボード';
});
Route::get('/admin/users', function () {
    return 'ユーザー管理';
});
Route::get('/admin/posts', function () {
    return '記事管理';
});

// ✅ グループを使う場合(推奨)
Route::prefix('admin')->group(function () {
    Route::get('/dashboard', function () {
        return '管理画面ダッシュボード';
    });
    Route::get('/users', function () {
        return 'ユーザー管理';
    });
    Route::get('/posts', function () {
        return '記事管理';
    });
});

// アクセスするURL
// /admin/dashboard
// /admin/users
// /admin/posts

メリット: /admin を何度も書く必要がなく、後から変更も容易です。

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

ルート名にも共通の接頭辞を付けることができます。

// routes/web.php

Route::prefix('admin')->name('admin.')->group(function () {
    Route::get('/dashboard', function () {
        return '管理画面ダッシュボード';
    })->name('dashboard');  // ルート名: admin.dashboard

    Route::get('/users', function () {
        return 'ユーザー管理';
    })->name('users');      // ルート名: admin.users
});

// ビューでの使用例
// {{ route('admin.dashboard') }} → /admin/dashboard
// {{ route('admin.users') }}     → /admin/users

実務での使用例

📋 よくある使い方

1. 管理画面のルートをまとめる

Route::prefix('admin')->name('admin.')->group(function () {
    // 管理画面のルートをここに記述
});

2. APIのバージョン管理

Route::prefix('api/v1')->group(function () {
    Route::get('/users', function () {
        // APIバージョン1のユーザー一覧
    });
});

Route::prefix('api/v2')->group(function () {
    Route::get('/users', function () {
        // APIバージョン2のユーザー一覧
    });
});

3. 多言語対応

Route::prefix('ja')->group(function () {
    Route::get('/about', function () {
        return '会社概要';
    });
});

Route::prefix('en')->group(function () {
    Route::get('/about', function () {
        return 'About Us';
    });
});

// /ja/about → 日本語
// /en/about → 英語

💡 ルートグループは、実務で必ず使う機能です。
特に、認証機能(ログインしたユーザーだけアクセス可能)を実装する際にも重要になります。
今のうちから慣れておきましょう。

定義したルートを確認する

Laravelには、定義されているすべてのルートを一覧表示するコマンドがあります。

php artisan route:list

このコマンドを実行すると、以下のような情報が表示されます:

  • HTTPメソッド(GET、POSTなど)
  • URI(URLのパス)
  • ルート名
  • 実行されるアクション

💡 デバッグやルートの確認に非常に便利なコマンドです。 「このURLはどのルートで処理されているんだろう?」と思ったら、このコマンドを使いましょう。

まとめ

この章では、Laravelのルーティングについて学びました。

重要なポイント

  • ルーティングはURLとプログラムを紐付ける仕組み
  • ルートは routes/web.php に定義する
  • Route::get() で文字列、HTML、ビューを返せる
  • URLパラメータを使って動的なページを作れる
  • php artisan route:list でルート一覧を確認できる

次のステップ

次の章では、ビュー(View)について詳しく学びます。 HTMLを別ファイルに分離して、より保守性の高いコードを書く方法を習得しましょう。

補足:Routeの仕組み(読まなくてもOK)

※ この説明は理解しなくても、ルーティングは使えます。興味がある方だけお読みください。

Route::get() の :: とは?

::スコープ解決演算子と呼ばれ、 PHPで静的メソッドやクラス定数を呼び出す記号です。

// 一般的な静的メソッドの例
class Math
{
    public static function add($a, $b)
    {
        return $a + $b;
    }
}

Math::add(1, 2);  // 3

LaravelのRouteは「Facade」

ただし、LaravelのRouteはFacade(ファサード)という特殊な仕組みを使っています。

見た目は静的メソッドですが、実際には内部でインスタンスメソッドを呼び出しています。

💡 Facadeとは?

Facade(ファサード)は、複雑なシステムをシンプルに使うための「窓口」です。

// ❌ Facadeを使わない場合(複雑)
$router = app('router');
$router->get('/hello', function () {
    return 'Hello';
});

// ✅ Facadeを使う場合(シンプル)
Route::get('/hello', function () {
    return 'Hello';
});

Facadeのおかげで、短く書けるようになっています。

初学者が覚えるべきこと

Route::get() でルートを定義できる」

これだけでOKです。Facadeやサービスコンテナの仕組みは、Laravelに慣れてから学ぶ中級者向けの知識です。

📚 詳しく知りたい方は、Laravel公式ドキュメントの「Facades」を参照してください。
https://laravel.com/docs/12.x/facades