【Laravel】Laravelのルーティング基礎:Route::getから学ぶ

laravelアイキャッチ Laravel

こんにちは、かつコーチです。

前回までにArtisanコマンドの使い方を確認して、Laravelを操作する準備が整いました。

ここからは、いよいよLaravelアプリの中身を作っていきます。

最初に学ぶべきは「ルーティング」です。

Laravelに限らずWebフレームワークを学ぶときは、まずルーティングから理解するのが定石とされています。

URLとその先の処理をつなぐ、いわば「アプリの入り口」だからです。

今日はここを、Route::get を軸にしっかり押さえていきましょう。

ルーティングとは?

URLと処理を結びつける仕組み

ルーティングとは、「このURLにアクセスされたら、この処理を実行する」という対応関係を定義する仕組みです。

たとえば /about にアクセスされたら会社概要のページを表示する、/contact にアクセスされたらお問い合わせフォームを表示する、といった具合です。

PHP編でミニフレームワークを自作したときにも触れましたが、素のPHPだとURLごとにファイルを用意するのが基本でした。

Laravelでは、この対応関係を1か所(ルートファイル)にまとめて管理できます。

ルートファイルの場所

Laravelのルーティング定義は、プロジェクト直下の routes/ フォルダにあります。

代表的なのは次の2つです。

  • routes/web.php:ブラウザからアクセスするための通常のWebページ用
  • routes/api.php:API(JSON形式でデータをやり取りする用途)用

初心者のうちは、まず routes/web.php だけを触ることになります。

このファイルを開くと、すでにこんな1行が書かれています。

<?php

use Illuminate\Support\Facades\Route;

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

これが「トップページ(/)にアクセスされたら、welcomeビューを表示する」というルート定義です。

基本の書き方:Route::get

一番シンプルな形

まずは、一番シンプルな形から見ていきましょう。

<?php

use Illuminate\Support\Facades\Route;

Route::get('/hello', function () {
    return 'こんにちは、かつコーチです!';
});

これを routes/web.php に追記して http://localhost/hello にアクセスすると、画面に「こんにちは、かつコーチです!」と表示されます。

構文を分解すると、次のようになります。

  • Route::get(...):GET通信でアクセスされたときのルートを定義する
  • '/hello':対象となるURLのパス
  • function () { ... }:そのURLにアクセスされたときに実行する処理(クロージャ)

「GET通信」とは、ブラウザでURLを直接開いたときやリンクをクリックしたときに使われる、データを取得するための通信方式です。

フォーム送信などでデータを送信するときは、後の記事で扱う Route::post を使います。

viewを返すパターン

実際のアプリでは、文字列をそのまま返すことはあまりなく、Bladeテンプレート(画面のHTML)を返すのが一般的です。

<?php

use Illuminate\Support\Facades\Route;

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

view('about') と書くと、resources/views/about.blade.php の内容が画面に表示されます。

Bladeについては、このシリーズの後半で詳しく解説する予定です。

パラメータ付きルート

URLの一部を可変にしたいときは、波括弧でパラメータを受け取れます。

<?php

use Illuminate\Support\Facades\Route;

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

http://localhost/users/5 にアクセスすると「ユーザーID:5」、/users/10 にアクセスすると「ユーザーID:10」が表示されます。

{id} の部分がURLの中身によって変わり、その値がクロージャの引数 $id にそのまま渡ってくる仕組みです。

会員ページや商品詳細ページなど、「IDによって表示内容が変わるページ」で必須のテクニックです。

つまずきやすいポイント:ルートの定義順序

上から順にマッチングされる

ここで、私が実際にハマった落とし穴を紹介します。

Laravelのルートは、上に書かれているものから順番にチェックされ、最初にマッチしたルートが使われます。

この性質を忘れて、パラメータ付きルートを固定URLより先に書いてしまい、意図しない挙動になったことがありました。

❌ Before:パラメータ付きルートを先に書いてしまう

<?php

use Illuminate\Support\Facades\Route;

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

Route::get('/users/create', function () {
    return '新規ユーザー作成ページ';
});

このコードで /users/create にアクセスすると、意図した「新規ユーザー作成ページ」ではなく、{id}"create" という文字列が代入され「ユーザーID:create」と表示されてしまいます。

先に定義されている /users/{id}/users/create にもマッチしてしまうためです。

✅ After:固定URLのルートを先に書く

<?php

use Illuminate\Support\Facades\Route;

Route::get('/users/create', function () {
    return '新規ユーザー作成ページ';
});

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

/users/create を先に定義しておけば、/users/create へのアクセスはそちらでマッチし、それ以外の /users/◯◯{id} のルートでマッチするようになります。

このバグに気づいたときは、なぜ新規作成ページが「ユーザーID:create」になるのか分からず、しばらく原因を探し回りました。

「固定のURLは、変動するパラメータ付きのURLより先に書く」というのは、ルーティング設計の基本ルールとして覚えておいてください。

ルートキャッシュにも要注意

もう一つ、初心者がよく戸惑うのが「ルートを書き換えたのに反映されない」という現象です。

本番環境向けに php artisan route:cache を実行してルートをキャッシュしていると、routes/web.php を編集しても変更が反映されません。

開発中に変更が反映されないときは、次のコマンドでキャッシュをクリアしてみてください。

php artisan route:clear

このあたりのキャッシュ絡みのトラブルは、Laravelのエラー集の記事でもまとめて扱う予定です。

定義済みルートを一覧で確認する

route:listコマンド

今どんなルートが定義されているか分からなくなったときは、Artisanコマンドで一覧を確認できます。

php artisan route:list

実行すると、メソッド(GET/POSTなど)・URI・処理内容が一覧で表示されます。

ルートが増えてきたときの棚卸しに便利なので、覚えておいて損はありません。

まとめ

この記事のポイント

  • ルーティングは「URLと処理を結びつける」Laravelの入り口となる仕組み
  • ルート定義は routes/web.php に書き、Route::get('/path', function () {...}) の形が基本
  • {id} のようなパラメータ付きルートで、URLの一部を可変にできる
  • 固定URLのルートは、パラメータ付きルートより先に定義する
  • php artisan route:list で定義済みルートを一覧確認できる

次に読むべき記事

ルーティングの基本が分かったところで、次はルートの数が増えてきたときに迷わないための整理術を解説します。

→ 次の記事:LaravelのRoute設計で迷わないための整理術

タイトルとURLをコピーしました