モダン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.14 | Lumen 10 | Flight 4 | Fat-Free 3.9 |
---|---|---|---|---|
最小容量※ | ≈100 KB | ≈3 MB | ≈70 KB | ≈130 KB |
PSR 準拠 | 7/15/17 | 部分 | ― | ― |
DI | 外付け | Laravel | 自前 | 自前 |
更新頻度 | ◎ | ○ | ○ | △ |
認証 | JWT/OAuth | Laravel | 要自作 | 要自作 |
開発環境セットアップ│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-alpine
と nginx: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 の軽さと拡張性を体感してください。