こんにちは、かつコーチです。
前回までに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設計で迷わないための整理術