概要

実際の Web アプリは「ホーム」「ユーザー一覧」「投稿フォーム」など 複数の URL を扱う。これを 1 つの PHP ファイルで捌くのが ルーター (Router) の役割。最小実装は驚くほど単純で、$_SERVER['REQUEST_METHOD'] (GET/POST) と $_SERVER['REQUEST_URI'] (/users などのパス) を見て ifmatch で分岐するだけ。

これは フロントコントローラ・パターン と呼ばれ、Laravel や Symfony でも考え方は同じ。フレームワークがやっているのは、この if-elseRoute::get('/users', fn() => ...) のような 宣言的な書き方 に整理しているだけ。本質は REQUEST_METHOD × REQUEST_URI の分岐という生 PHP の発想と変わらない。

ドリルでは GET / → home、GET /users → 一覧、POST /users → 登録、と 「メソッド × パス」の組み合わせ で応答を分ける練習をする。「同じ URL でも GET と POST で意味が違う」考え方は REST API の基本で、ここを通っておくと後でフレームワークのコントローラ・アクションが「あの分岐をクラスに整理しただけか」と腹落ちする。

学習目標

ドリル

no 内容
01 1 行目に method、2 行目に URI を受け取り、GET / のみ "home" を出力、その他は "404"
02 URI で分岐: /users"users一覧" / /posts"posts一覧" / その他 → "404"
03 method + URI で分岐: GET /users"一覧表示" / POST /users"新規登録" / その他 → "404"

本物の Web で確認したい場合

cd topics/web/ch06-routing-basic/drill/03-method-uri/
php -S localhost:8000 answer.php

ブラウザで http://localhost:8000/users (GET) を開く。POST は curl で:

curl -X POST http://localhost:8000/users

演習: ドリル 01 — `GET /` のみ受け付けるミニルーター

問題

$_SERVER['REQUEST_METHOD']$_SERVER['REQUEST_URI'] を見て、次の通り応答する PHP を書いてください。

採点ランナーは CLI 直実行なので、冒頭で stdin の 1 行目を method、2 行目を URI として $_SERVER に代入してください。

このドリルの入力例:

GET
/

期待される出力:

home

ヒント

$_SERVER['REQUEST_METHOD'] = trim(fgets(STDIN) ?: '');
$_SERVER['REQUEST_URI']    = trim(fgets(STDIN) ?: '');

if ($_SERVER['REQUEST_METHOD'] === 'GET' && $_SERVER['REQUEST_URI'] === '/') {
    echo "home\n";
} else {
    echo "404\n";
}

演習: ドリル 02 — URI で分岐するルーター

問題

$_SERVER['REQUEST_URI'] を見て、次の通り応答する PHP を書いてください。

採点ランナーは CLI 直実行なので、冒頭で stdin の 1 行$_SERVER['REQUEST_URI'] に代入してください。

このドリルの入力例:

/users

期待される出力:

users一覧

ヒント

$_SERVER['REQUEST_URI'] = trim(fgets(STDIN) ?: '');
echo match ($_SERVER['REQUEST_URI']) {
    '/users' => "users一覧\n",
    '/posts' => "posts一覧\n",
    default  => "404\n",
};

演習: ドリル 03 — method + URI の組で分岐 (REST 風)

問題

$_SERVER['REQUEST_METHOD']$_SERVER['REQUEST_URI'] の組み合わせで、次の通り応答する PHP を書いてください。

採点ランナーは CLI 直実行なので、冒頭で stdin の 1 行目を method、2 行目を URI として $_SERVER に代入してください。

このドリルの入力例:

POST
/users

期待される出力:

新規登録

ヒント

$_SERVER['REQUEST_METHOD'] = trim(fgets(STDIN) ?: '');
$_SERVER['REQUEST_URI']    = trim(fgets(STDIN) ?: '');

$key = $_SERVER['REQUEST_METHOD'] . ' ' . $_SERVER['REQUEST_URI'];
echo match ($key) {
    'GET /users'  => "一覧表示\n",
    'POST /users' => "新規登録\n",
    default       => "404\n",
};

METHOD URI という文字列にまとめて 1 つの match で捌く」が小ぶりなアプリのお決まりパターン。

この章を AI に聞く

  1. 「ch06 — 簡易ルーター (REQUEST_METHOD + REQUEST_URI 分岐)」のつまずきやすいポイントを、初学者向けに3つ教えてください

    💬 ChatGPT 📘 Claude ✨ Gemini

  2. 「ch06 — 簡易ルーター (REQUEST_METHOD + REQUEST_URI 分岐)」について、自分の手で試せる練習問題を3つ出してください (難易度を上げながら)

    💬 ChatGPT 📘 Claude ✨ Gemini

  3. 「ch06 — 簡易ルーター (REQUEST_METHOD + REQUEST_URI 分岐)」を学んだ後、次に学ぶと良いトピックは何ですか?理由も教えてください

    💬 ChatGPT 📘 Claude ✨ Gemini

🎉 受講お疲れさまでした!

ch06 — 簡易ルーター (REQUEST_METHOD + REQUEST_URI 分岐)」を読み終えました。
学んだことを誰かに教えると、もっと記憶に残ります。

X で共有 Hatena LINE