#02 Laravelを始めよう

ルーティングとコントローラーを理解する

前回は 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つを覚えましょう。

動詞ルートの書き方使う場面
GETRoute::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/33
/users/100100
/users/abcabc

コントローラーを使う

処理が増えるにつれ、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に組み込みます。