Slimフレームワークとは
Slimは、PHPで書かれた軽量なマイクロフレームワークです。Laravelのような大規模フレームワークとは異なり、「最小限の機能だけ持つ」という思想で設計されています。REST APIやシンプルなWebアプリケーションを素早く作りたいときに最適です。
主な特徴は以下のとおりです。
- シンプルで学習コストが低い
- PSR-7(HTTPメッセージインターフェース)準拠
- ミドルウェアによる柔軟な拡張
- Composerで簡単にインストール可能
インストールと初期セットアップ
ComposerでSlimをインストールします。
mkdir slim-api && cd slim-api
composer require slim/slim:"4.*"
composer require slim/psr7
プロジェクト構成はシンプルにまとめます。
slim-api/
├── public/
│ └── index.php # エントリポイント
├── src/
│ └── routes.php # ルート定義
└── composer.json
public/index.php を作成してアプリケーションを起動します。
<?php
// public/index.php
require __DIR__ . '/../vendor/autoload.php';
use Slim\Factory\AppFactory;
$app = AppFactory::create();
// ルーティングを読み込む
require __DIR__ . '/../src/routes.php';
$app->run();
ビルトインサーバーで動作確認できます。
php -S localhost:8080 -t public
基本的なルーティング
Slimのルーティングは非常に直感的です。GET・POST・PUT・DELETEなどHTTPメソッドに対応したメソッドが用意されています。
<?php
// src/routes.php
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
// GETリクエスト:全ユーザー取得
$app->get('/users', function (Request $request, Response $response): Response {
$users = [
['id' => 1, 'name' => '田中太郎', 'email' => 'tanaka@example.com'],
['id' => 2, 'name' => '鈴木花子', 'email' => 'suzuki@example.com'],
];
$response->getBody()->write(json_encode($users, JSON_UNESCAPED_UNICODE));
return $response->withHeader('Content-Type', 'application/json');
});
// GETリクエスト:特定ユーザー取得(パスパラメータ)
$app->get('/users/{id}', function (Request $request, Response $response, array $args): Response {
$id = (int) $args['id'];
$user = ['id' => $id, 'name' => '田中太郎', 'email' => 'tanaka@example.com'];
$response->getBody()->write(json_encode($user, JSON_UNESCAPED_UNICODE));
return $response->withHeader('Content-Type', 'application/json');
});
パスパラメータは {id} のように {} で囲んで定義します。ハンドラの第3引数 $args から値を取得できます。
POSTリクエストとリクエストボディの取得
ユーザー作成のエンドポイントを追加します。
// POSTリクエスト:ユーザー作成
$app->post('/users', function (Request $request, Response $response): Response {
// リクエストボディをJSONとしてパース
$body = (string) $request->getBody();
$data = json_decode($body, true);
if (empty($data['name']) || empty($data['email'])) {
$error = ['error' => 'nameとemailは必須です'];
$response->getBody()->write(json_encode($error, JSON_UNESCAPED_UNICODE));
return $response->withHeader('Content-Type', 'application/json')->withStatus(400);
}
// 実際はDBに保存するが、ここではダミーデータを返す
$newUser = [
'id' => 3,
'name' => $data['name'],
'email' => $data['email'],
];
$response->getBody()->write(json_encode($newUser, JSON_UNESCAPED_UNICODE));
return $response->withHeader('Content-Type', 'application/json')->withStatus(201);
});
withStatus(201) でHTTPステータスコードを指定できます。バリデーションエラーは 400 を返すのが一般的です。
ミドルウェアの活用
Slimではミドルウェアを使ってリクエスト・レスポンスの処理を共通化できます。例として、すべてのレスポンスに Content-Type: application/json を付与するミドルウェアを作成します。
use Psr\Http\Server\RequestHandlerInterface as RequestHandler;
// JSONレスポンスヘッダーを付与するミドルウェア
$jsonMiddleware = function (Request $request, RequestHandler $handler): Response {
$response = $handler->handle($request);
return $response->withHeader('Content-Type', 'application/json; charset=utf-8');
};
// アプリ全体に適用
$app->add($jsonMiddleware);
ミドルウェアは $app->add() でグローバルに適用するほか、特定のルートグループだけに適用することもできます。
// /api 以下のルートだけにミドルウェアを適用
$app->group('/api', function ($group) {
$group->get('/products', function (Request $request, Response $response): Response {
$products = [['id' => 1, 'name' => '商品A']];
$response->getBody()->write(json_encode($products, JSON_UNESCAPED_UNICODE));
return $response;
});
})->add($jsonMiddleware);
エラーハンドリングの設定
Slimには組み込みのエラーハンドリング機能があります。addErrorMiddleware() を追加するだけで未定義ルートへのアクセスや例外をJSON形式で返せます。
// エラーハンドリングミドルウェアを追加(開発時はtrueを指定)
$errorMiddleware = $app->addErrorMiddleware(true, true, true);
引数はそれぞれ「エラー詳細の表示」「例外の表示」「ログへの記録」を制御します。本番環境では最初の引数を false にしてエラー詳細を隠すようにしましょう。
まとめ
Slimフレームワークのポイントをおさらいします。
| 機能 | 説明 |
|---|---|
| ルーティング | get()・post()・put()・delete() でHTTPメソッドに対応 |
| パスパラメータ | {id} で定義し $args から取得 |
| レスポンス | withHeader() / withStatus() でカスタマイズ |
| ミドルウェア | add() でグローバルまたはグループに適用 |
| エラーハンドリング | addErrorMiddleware() で一括管理 |
Slimは「必要な機能だけ追加する」という哲学のフレームワークです。Laravelほどの機能は不要だけどゼロから書くのも大変、というシーンにぴったりです。REST APIのバックエンドや小規模なサービスに、ぜひ活用してみてください。