概要
実際の Web アプリは「ホーム」「ユーザー一覧」「投稿フォーム」など 複数の URL を扱う。これを 1 つの PHP ファイルで捌くのが ルーター (Router) の役割。最小実装は驚くほど単純で、$_SERVER['REQUEST_METHOD'] (GET/POST) と $_SERVER['REQUEST_URI'] (/users などのパス) を見て if か match で分岐するだけ。
これは フロントコントローラ・パターン と呼ばれ、Laravel や Symfony でも考え方は同じ。フレームワークがやっているのは、この if-else を Route::get('/users', fn() => ...) のような 宣言的な書き方 に整理しているだけ。本質は REQUEST_METHOD × REQUEST_URI の分岐という生 PHP の発想と変わらない。
ドリルでは GET / → home、GET /users → 一覧、POST /users → 登録、と 「メソッド × パス」の組み合わせ で応答を分ける練習をする。「同じ URL でも GET と POST で意味が違う」考え方は REST API の基本で、ここを通っておくと後でフレームワークのコントローラ・アクションが「あの分岐をクラスに整理しただけか」と腹落ちする。
学習目標
$_SERVER['REQUEST_METHOD']と$_SERVER['REQUEST_URI']を組み合わせて 「メソッド + URI」 で応答を分けられる- 1 つの PHP で複数の URL を捌ける (フロントコントローラ・パターンの最小版)
- フレームワーク (Laravel など) のルーターが内部でやっていることをイメージできる
ドリル
| 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 を書いてください。
- method が
GETかつ URI が/のとき →"home"を 1 行出力 - それ以外 →
"404"を 1 行出力
採点ランナーは 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 を書いてください。
/users→"users一覧"を 1 行出力/posts→"posts一覧"を 1 行出力- それ以外 →
"404"を 1 行出力
採点ランナーは 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 を書いてください。
GET /users→"一覧表示"を 1 行出力POST /users→"新規登録"を 1 行出力- それ以外 →
"404"を 1 行出力
採点ランナーは 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 に聞く
-
「ch06 — 簡易ルーター (REQUEST_METHOD + REQUEST_URI 分岐)」のつまずきやすいポイントを、初学者向けに3つ教えてください
-
「ch06 — 簡易ルーター (REQUEST_METHOD + REQUEST_URI 分岐)」について、自分の手で試せる練習問題を3つ出してください (難易度を上げながら)
-
「ch06 — 簡易ルーター (REQUEST_METHOD + REQUEST_URI 分岐)」を学んだ後、次に学ぶと良いトピックは何ですか?理由も教えてください