モダンPHPで作るシンプルREST API:Slimフレームワークチュートリアル

モダンPHPで作るシンプルREST API:Slimフレームワークチュートリアル

モダンPHPで作るシンプルREST API:Slimフレームワークチュートリアル

PHP 8.3 では JIT や readonly クラスなどが入り、レガシー言語という先入観は過去のものになりつつあります。

フロント側は TypeScript + SPA が主流となり、「サーバは JSON を返すだけ」という構成が一般化しました。そこで再評価されているのがマイクロフレームワークです。

巨大なフルスタックを抱えず、ルーティングとミドルウェアだけで API を迅速に構築できる Slim は、小規模サービスや社内ツールを「今日中に動かしたい」場面で真価を発揮します。

この記事では環境構築から JWT 認証、Rate Limit、OpenAPI ドキュメント生成までを一気に体験し、「最小コストで始めて、拡張にも耐える設計」を解説します。

目次

Slim 4 最新版の姿と選ばれる理由│2025年アップデート

公式 GitHub では2025年5月時点の安定系が4.14.x。メジャーバージョンは変わらず継続的にパッチが提供されており、コミュニティの活発さも維持されています。

コアは圧縮時で約100KB前後と小さく、PSR-7/15/17 準拠で周辺エコシステムと親和性が高いことから、PoC から本番運用にスケールさせる際も「乗り換えコストゼロ」です。

DI コンテナを組み込む方法

Slim はデフォルトで DI を含まないため、ビジネスロジックをクラス分割した瞬間に「依存注入したい」と感じるはずです。もっとも手軽なのが PHP-DI との統合です。

use DI\Container;
use Slim\Factory\AppFactory;

$container = new Container();
$container->set(BookService::class, fn() => new BookService(new BookRepository));
AppFactory::setContainer($container);

$app = AppFactory::create();
// コントローラでは $this->container->get(BookService::class) が利用可能

createContainer() で設定を書き溜め、AppFactory::setContainer() で Slim 側に渡すだけ。これでサービス層のモック差し替えやユニットテストがぐっと楽になります。

2025年版マイクロフレームワーク比較表

項目Slim 4.14Lumen 10Flight 4Fat-Free 3.9
最小容量※≈100 KB≈3 MB≈70 KB≈130 KB
PSR 準拠7/15/17部分
DI外付けLaravel自前自前
更新頻度
認証JWT/OAuthLaravel要自作要自作
※Packagist ZIP サイズ概算。

開発環境セットアップ│Composer と PSR-17 の補足

まず Composer で依存を追加します。__DIR__ はマジック定数なのでタイポ(誤植・入力ミス)に注意しましょう。

composer require slim/slim "^4.14"        # 本体
composer require slim/psr7                # PSR-7 実装
composer require nyholm/psr7-server --dev # PSR-17 ファクトリ(必要なら)
composer require firebase/php-jwt "^6.11" # 認証
composer require php-di/php-di            # DI

PSR-17 対応ライブラリが要求される場面(OpenAPI バリデータなど)で nyholm/psr7-server を追加しておくとファクトリクラスの実装差で悩まずに済みます。

ルーティングとコントローラ設計の基本

REST の暗黙知である「リソース名は複数形、動詞は HTTP メソッド」を守ることで URL 自体がドキュメントになります。以下は最小構成の例です。

$app->get('/books', function ($req, $res) {
    $payload = json_encode(['items' => []], JSON_UNESCAPED_UNICODE);
    $res->getBody()->write($payload);
    return $res->withHeader('Content-Type', 'application/json');
});

配列返却時は JSON_UNESCAPED_UNICODE を付けて文字化けを防ぎます。将来的に DI を導入するなら、クロージャではなくクラスコントローラへ切り替え、サービス層を注入できる形へ整備すると拡張が容易です。

ミドルウェアで共通処理を整理│エラーハンドリング改善

例外を JSON に統一するミドルウェアを置けば、フロント側は常に同じスキーマでエラー処理できます。Monolog を仕込んでリクエスト ID を付与しておくと、分散トレーシングに発展させやすくなります。

JWT 認証の実装とセキュリティ強化

Firebase PHP-JWT は v6.11.1 が最新です(記事執筆時点)。旧版(< 6.0.0)はアルゴリズム混同脆弱性(CVE-2021-46743)が報告されているため、必ず最新版を選んで alg を固定してください。

try {
    $claims = JWT::decode($token, new Key($_ENV['JWT_SECRET'], 'HS256'));
    // $claims->sub にユーザー ID
} catch (\Exception $e) {
    return jsonError(401, 'Token invalid');
}

JWT の有効期限とリプレイ攻撃対策

トークンには exp(有効期限)と jti(一意 ID)を必ず含め、短めの有効期限+リフレッシュトークンを組み合わせるのが鉄則です。

リプレイ攻撃を防ぐには jti を Redis に保存し、ログアウト時や不正検知時にブラックリストへ追加します。

// 発行時
$payload = [
    'sub' => $userId,
    'iat' => time(),
    'exp' => time() + 900,         // 15 分
    'jti' => bin2hex(random_bytes(8))
];
$jwt = JWT::encode($payload, $_ENV['JWT_SECRET'], 'HS256');

// 検証時
if ($redis->exists('blacklist:' . $claims->jti)) {
    return jsonError(401, 'Token revoked');
}

これで盗まれたトークンを即座に無効化でき、ゼロダウンタイムで再発行可能です。

API テスト・Rate Limit・運用の勘所

統合テストは Postman コレクション+ newman で CI に組み込み、Docker では php:8.3-fpm-alpinenginx:alpine を併用して本番と同一構成を保ちます。

DoS 対策にはキャッシュ用の slim/http-cache ではなく、Redis を利用したトークンバケット方式や middlewares/rate-limit を導入し、PSR-15 ミドルウェアで残リクエスト数ヘッダを返しましょう。

ノーコード×Slimで爆速バックエンド開発|Supabase・Firebase連携の最適解とは?

OpenAPI ドキュメントを自動生成する

Slim 単体にはドキュメント機能がないため、アノテーションで仕様を書き出す zircote/swagger-php が定番です(最新 5.1.3)。

composer require zircote/swagger-php "^5.1"
vendor/bin/openapi --output openapi.yaml src
use OpenApi\Attributes as OA;

#[OA\Info(title: 'Book API', version: '1.0')]
class ApiInfo {}

#[OA\Get(
    path: '/books',
    responses: [new OA\Response(response: 200, description: 'List')]
)]
class BookController {}

出力された openapi.yaml を Swagger UI や Redoc に食わせれば、エンドポイント一覧が即座にブラウザ表示され、チーム共有が劇的に楽になります。

低レベル API 操作が必要な場合は cebe/php-openapi を組み合わせ、仕様のマージやバリデーションにも活用できます。(GitHub)

Laravel OctaneとSlim/Lumenを比較:高速ランタイムとマイクロフレームワークの使い分け徹底解説

まとめ:Slim と周辺ツールで育てるスケーラブル REST API

Slim 4 は「軽量コア+標準準拠+活発なコミュニティ」という三拍子がそろい、小規模 API を最速で立ち上げるのに最適です。

DI に PHP-DI、ドキュメント生成に swagger-php、Rate Limit に PSR-15 ミドルウェアを追加すれば、中規模以上へ育てる下地も万全です。

この記事で紹介した手順を踏めば、「まず動く」だけでなく「長く保守できる」構成を実現できます。ぜひ手を動かして、Slim の軽さと拡張性を体感してください。

PHP 8 新機能解説:ユニオン型・名前付き引数・Match 式から JIT まで

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次