🌟

フレームワークなしでシンプルなPHPルーターを実装する方法

に公開

概要

この投稿では、PHPのみを使って実装した簡易的なAPIルーターについて紹介します。
「フレームワークなし」でWebアプリを作る過程を通じて、PHPの基本的なリクエスト処理の流れを学ぶことができます。
今回の例では、index.php を起点として /users エンドポイントへのPOSTリクエストを処理し、ユーザー登録処理へとつなげる構造になっています。

ディレクトリ構成(一部)

backend-php/
├── public/
│   └── index.php  ← ここにルーティング処理を記述
└── src/
    └── register.php  ← ユーザー登録処理

コード全文(public/index.php)

<?php

$requestUri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); // リクエストのパスを取得
$requestMethod = $_SERVER['REQUEST_METHOD']; // HTTPメソッド(GET, POSTなど)を取得

header("Content-Type: application/json; charset=UTF-8");

if ($requestUri === '/users' && $requestMethod === 'POST') {
  require_once __DIR__ . '/../src/register.php';
} else {
  http_response_code(404);
  echo json_encode(['error' => 'Not Found']);
}

処理の流れ

  1. リクエストURLの取得
    parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) を使って /users などのパスを取得します。
  2. HTTPメソッドの取得
    $_SERVER['REQUEST_METHOD'] によって、GET, POST, PUT などのリクエスト種別を取得します。
  3. 条件分岐によるルーティング
    /users かつ POST のリクエストが来た場合に限り、src/register.php を読み込み、処理を移譲します。
  4. 404エラーハンドリング
    対応していないルートやメソッドには 404 を返します。
    404エラーを返すことで、存在しないエンドポイントやメソッドの呼び出しに対して明確なレスポンスを返すことができます。APIの正確な利用を促す役割も果たします。

コード詳細の解説

$requestUri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
  • $_SERVER['REQUEST_URI'] は、ブラウザなどがリクエストしてきたURLの「パス+クエリ文字列」を取得します。
    • 例:ブラウザがhttp://localhost/users?name=Tomにアクセスしたら
      → $_SERVER['REQUEST_URI'] は "/users?name=Tom" になります。
  • 今回ルーティングで使いたいのは /users という「パス部分」だけです。
    → そこで、parse_url(..., PHP_URL_PATH) を使うと、/users?name=Tom → /users だけを取り出せます。
  • URLのうち、ルーティングに必要な「パス」だけを取り出す処理です。
$requestMethod = $_SERVER['REQUEST_METHOD'];
  • クライアントが送ってきた HTTPメソッド(GET, POST, PUT など)を取得します。
  • これは 「どういう操作なのか」を見分けるために使う情報です。
    たとえば:
    • ユーザー一覧を取得 → GET
    • ユーザーを新規登録 → POST
  • どの操作がリクエストされたか(POSTかGETかなど)を判断するためのコードです。
header("Content-Type: application/json; charset=UTF-8");
  • APIサーバーがレスポンスを返すときには、「どんな形式のデータなのか」をクライアント(例:ブラウザやJavaScriptのコード)に正確に伝える必要があります。
    その役目を果たすのが Content-Type ヘッダーです。
  • 今回は application/json を指定することで、**「このレスポンスはJSON形式です」**と明示しています。
  • APIではデータを JSON 形式で返すのが一般的であり、JavaScript の fetch().json() などで正しく扱うためにはこのヘッダーが必須です。

    実際のAPIでのやりとり(イメージ)

【クライアント】→ サーバーへ POST  
   POST /users  
   Accept: application/json  

【サーバー】→ レスポンス  
   HTTP/1.1 200 OK  
   Content-Type: application/json; charset=UTF-8  

   {"message": "登録に成功しました"}
require_once __DIR__ . '/../src/register.php';
  • __DIR__は「今このファイルがあるディレクトリ」を示す特別な値です。
  • たとえば index.php が /app/public/index.php にある場合、__DIR__は /app/public になります。
  • そこから ../src/register.php を読み込むことで、ユーザー登録の処理ファイルに処理を渡します。
  • require_once は、一度だけファイルを読み込む関数。間違って何度も読み込んでバグにならないようにしています。
  • /usersへのリクエストが来たら、ユーザー登録用のコードを読み込んで実行するという命令です。

補足

この構造は、フレームワークを使用しない小規模なAPIや学習用途で有効です。将来的には以下のような拡張が考えられます。

  • 複数ルートへの対応(例:GET /users, PUT /users/{id})
  • ルーティングロジックの切り出し
  • コントローラークラス化

まとめ

PHPのみでAPIルーターを構築するのはシンプルながらも理解が深まる方法です。
最低限の構造から出発し、徐々に機能追加していくことで、PHPの仕組みやWebアーキテクチャの理解が深まります。

Discussion