LLaravel Bootcamp

Day 3ルーティングとコントローラー、ルートモデルバインディング

ルーティングの基本

URLとHTTPメソッドの組み合わせを、どの処理に結びつけるかを定義する仕組みを理解する。

ルーティングとは何か

ルーティングとは「どのURLに、どのHTTPメソッドでアクセスが来たら、どの処理を動かすか」を対応づける表のことです。ブラウザやアプリから届いたリクエストは、まずこのルーティング定義を見て「行き先」を決められます。 の入口にあたる、アプリの交通整理役だと考えてください。

Laravelでは、ルート定義は「routes」ディレクトリに置かれた設定ファイルにまとめて書きます。画面(HTML)を返す普通のWebアクセス向けは「web.php」、JSONを返すAPI向けは「api.php」と、用途でファイルが分かれているのが特徴です。

なぜweb.phpとapi.phpを分けるのか

同じアプリでも、ブラウザ向けの画面表示とスマホアプリ向けのAPIでは、必要な下ごしらえ(前処理)が違います。web.phpにはセッションやCSRF対策などブラウザ向けの が、api.phpにはトークン認証やレート制限などAPI向けの前処理が、それぞれ自動で適用されます。ファイルを分けることで「この経路には何が効いているか」が一目で分かり、設定ミスを防げます。

HTTPメソッドとルート定義

同じURLでも、HTTPメソッド(GET・POST・PUT・PATCH・DELETE)が違えば意味が変わります。GETは「取得(見るだけ)」、POSTは「新規作成」、PUT/PATCHは「更新」、DELETEは「削除」というように、メソッドが操作の種類を表します。ルートはこの「URL × メソッド」の組で登録します。

PHP
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\PostController;

// GET /posts        → 一覧を表示
Route::get('/posts', [PostController::class, 'index']);

// GET /posts/create → 新規作成フォームを表示
Route::get('/posts/create', [PostController::class, 'create']);

// POST /posts       → 送信された内容を保存
Route::post('/posts', [PostController::class, 'store']);
routes/web.php — メソッドごとにルートを登録する

補足

「Route::get('/posts', [PostController::class, 'index'])」は、「GETで /posts に来たら、PostControllerのindexメソッドを動かす」という意味です。第2引数の「[クラス, 'メソッド名']」が行き先の指定です。

名前付きルート

ルートには「名前」を付けられます。URLの文字列そのものではなく、この名前を使ってリンクやリダイレクト先を組み立てられます。こうしておくと、あとでURLの綴りを変えても、名前さえ同じなら参照側を直さずに済みます。

PHP
Route::get('/posts/{post}', [PostController::class, 'show'])
    ->name('posts.show');

// 別の場所ではURL文字列ではなく「名前」で参照する
$url = route('posts.show', ['post' => 10]); // => /posts/10
名前付きルートと、その参照

なぜURLを直書きせず名前で参照するのか

URLの文字列をコードのあちこちに直書きすると、URL構成を変えたいときに全箇所を探して直す羽目になります。名前付きルートなら、URLの定義は1か所、参照は名前経由になるので、変更に強い(修正漏れが起きにくい)設計になります。「一箇所を直せば全体に反映される」状態を保つのが狙いです。

RESTfulリソースルート

投稿・ユーザー・商品のような「リソース(資源)」に対する操作は、だいたい決まったパターン(一覧・詳細・作成フォーム・保存・編集フォーム・更新・削除)になります。Laravelはこの定番7アクションを1行でまとめて登録できる「リソースルート」を用意しています。

PHP
// これ1行で index / create / store / show / edit / update / destroy が登録される
Route::resource('posts', PostController::class);

// 確認: どんなルートが生えたかはコマンドで一覧できる
// $ php artisan route:list
1行で7つの定番ルートをまとめて定義する

落とし穴

リソースルートは便利ですが、無関係なアクションまで全部作られると「使われないルート」が残りがちです。必要なものだけに絞りたいときは「Route::resource(...)->only(['index','show'])」のように限定しましょう。

面接ではこう言う

「ルーティングは、URLとHTTPメソッドの組み合わせを処理に対応づける層です。私はRESTの考え方に沿って、リソースに対する操作を『GET=取得・POST=作成・PUT/PATCH=更新・DELETE=削除』と揃え、リソースルートで定番7アクションを一貫した命名で定義します。URLはコードに直書きせず名前付きルートで参照し、URL変更に強い構成を心がけています」と説明できます。

読んでも腑に落ちない所は、AIに噛み砕いてもらいましょう。

理解度チェック

答えられれば、面接で説明できる状態に一歩近づきます。

Q1

web.php と api.php を分けている主な理由として、最も適切なものはどれか。

Q2

名前付きルートを使う利点として最も適切なものはどれか。

Q3

RESTfulなリソースルートを使うと、どんな利点があるか。面接官に説明するつもりで述べよ。

記述式です。まず自分の言葉で答えを考えてから、模範解答を開いて自己採点してください。