ルーティングとコントローラーを理解する
前回は routes/web.php に直接処理を書きました。今回はURLと処理をつなぐ仕組みをもう少し深く理解して、本格的な開発の土台を作ります。
ルーティングおさらい
ルーティング? URLと処理を結びつける仕組み。「このURLにアクセスしたら、このコードを実行する」という対応表のようなもの。 はすべて routes/web.php というファイルに書きます。
前回書いたこのコードを思い出してください。
// 📁 routes/web.php
Route::get('/hello', function () {
return 'Hello, Laravel!';
});
「/hello というURLに GETリクエスト? ブラウザがサーバーに「データをください」と要求する方法。URLを入力してページを表示するときに使われる。 でアクセスしたら、この処理を実行する」という意味でした。
動詞によって役割が違う
HTTP? ブラウザとサーバーがやり取りするときに使うルール(プロトコル)。URLにアクセスすると、このルールでリクエストとレスポンスが交わされる。 には「動詞」があります。よく使う2つを覚えましょう。
| 動詞 | ルートの書き方 | 使う場面 |
|---|---|---|
| GET | Route::get() | ページを表示する |
| POSTリクエスト? フォームからデータを送信するときに使うHTTPの方法。パスワードや本文などのデータをURLに露出させずに送れる。 | Route::post() | フォームのデータを受け取る |
「一覧ページを表示する」はGET、「フォームの送信を処理する」はPOSTです。この使い分けはこのシリーズを通じて何度も出てきます。
URLにパラメーターを含める
URLの一部を変数として受け取れます。たとえば「ユーザーID=3の詳細ページ」のようなURLです。
routes/web.php に以下を追加してみてください。
// 📁 routes/web.php
Route::get('/users/{id}', function ($id) {
return 'ユーザーID: ' . $id;
});
{id} の部分がURL中の変数になります。関数の引数 $id に自動で渡されます。
| アクセスするURL | $id の値 |
|---|---|
/users/3 | 3 |
/users/100 | 100 |
/users/abc | abc |
コントローラーを使う
処理が増えるにつれ、routes/web.php に直接コードを書き続けると管理が難しくなります。そこで コントローラー? ユーザーの操作(リクエスト)を受け取り、必要な処理をしてビューに渡す橋渡し役。MVCの「C」にあたる。 を使います。
コントローラーは app/Http/Controllers/ フォルダに置くPHPのクラスです。処理をここにまとめることで、ルートファイルはシンプルに保てます。
① コントローラーファイルを生成する
ターミナルで次のコマンドを実行してください(myapp フォルダ内で実行します)。
php artisan make:controller UserController
コマンドを実行すると app/Http/Controllers/UserController.php というファイルが自動で作られます。わざわざゼロから書く必要はありません。
作られたファイルを開くとこのような内容になっています。
<?php
// 📁 app/Http/Controllers/UserController.php(自動生成直後)
namespace App\Http\Controllers;
class UserController extends Controller
{
//
}
// の部分に実際の処理を書いていきます。
② メソッドを追加する
コントローラーに2つのメソッドを追加します。// の行を削除して、次のように書き換えてください。
<?php
// 📁 app/Http/Controllers/UserController.php
namespace App\Http\Controllers;
class UserController extends Controller
{
// ユーザー一覧を表示するメソッド
public function index()
{
return 'ユーザー一覧ページです';
}
// 特定ユーザーの詳細を表示するメソッド
public function show($id)
{
return 'ユーザーID: ' . $id . ' の詳細ページです';
}
}
index(一覧)と show(詳細1件)という名前はLaravelの慣習です。後で出てくる リソースコントローラー? CRUD操作(一覧・詳細・作成・更新・削除)に対応した7つのメソッドをまとめたコントローラー。`Route::resource()`と組み合わせて使う。 でも同じ名前を使います。
③ ルートをコントローラーに向ける
routes/web.php を開いてください。先ほど書いた /users/{id} のルートを削除(またはコメントアウト)して、次の2行に書き換えます。
<?php
// 📁 routes/web.php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\UserController; // ← この行を追加
Route::get('/', function () {
return view('welcome');
});
// ↓ UserControllerを使うルート
Route::get('/users', [UserController::class, 'index']);
Route::get('/users/{id}', [UserController::class, 'show']);
use App\Http\Controllers\UserController; という行でコントローラーを「インポート」(読み込み宣言)しています。ファイルの先頭のほうに書くのがルールです。
第2引数が [UserController::class, 'メソッド名'] という配列になりました。「このコントローラーのこのメソッドを呼ぶ」という意味です。
ブラウザで確認してみてください。
http://localhost:8000/users→ 「ユーザー一覧ページです」http://localhost:8000/users/5→ 「ユーザーID: 5 の詳細ページです」
名前付きルート
ルートに名前をつけておくと、URLの文字列をコードのあちこちに直接書かずに済みます。
routes/web.php のルート定義に .name(...) を追加します。
// 📁 routes/web.php
Route::get('/users', [UserController::class, 'index'])->name('users.index');
Route::get('/users/{id}', [UserController::class, 'show'])->name('users.show');
名前からURLを生成するには route() ヘルパー関数を使います。コントローラーやビューの中で呼び出せます。
// '/users' というURLを生成
$url = route('users.index');
// '/users/3' というURLを生成
$url = route('users.show', ['id' => 3]);
URLを /user-list に変えたくなったとき、ルートの定義1か所を直すだけで、route('users.index') を使っている場所がすべて自動で追随します。
ルート一覧を確認する
定義したルートの一覧を表示するコマンドです。ターミナルで実行してください。
php artisan route:list
現在登録されているすべてのURL・HTTPメソッド・コントローラーとメソッド名の対応表が表示されます。「あのURLはどのコントローラーで処理している?」と迷ったときに便利です。
まとめ
この回でやったこと:
routes/web.phpで ルーティング? URLと処理を結びつける仕組み。「このURLにアクセスしたら、このコードを実行する」という対応表のようなもの。 を書いた{id}でURLパラメーターを受け取ったphp artisan make:controllerで コントローラー? ユーザーの操作(リクエスト)を受け取り、必要な処理をしてビューに渡す橋渡し役。MVCの「C」にあたる。 ファイルを自動生成したapp/Http/Controllers/UserController.phpにメソッドを書いた- 名前付きルートで
route()ヘルパーからURLを生成した
次回は Blade? LaravelのテンプレートエンジンでHTMLの中にPHPの処理を埋め込める。`@if`や`@foreach`などの専用構文が使いやすい。 テンプレートを使って、コントローラーから受け取ったデータをHTMLに組み込みます。