タイトル: Slim
SEOタイトル: Slim Framework 完全ガイド|PHP マイクロフレームワークで API / マイクロサービスを最速構築
| この記事の要点 |
|
Slim Framework とは
Slim Framework は Josh Lockhart が 2010 年に公開した PHP のマイクロフレームワーク。Laravel や Symfony のような「フルスタック」ではなく、HTTP リクエストを受けてレスポンスを返すという Web の最小単位だけを高速・低オーバーヘッドで処理することに特化しています。
「ルーティング + ミドルウェア + DI コンテナ」しか持たないため、自分で必要なライブラリ(テンプレートエンジン、ORM、バリデーション)を組み合わせて使います。「やりたいことだけを薄く乗せる」のが Slim の哲学です。
主な特徴
| 項目 | 内容 |
|---|---|
| サイズ | コア数百 KB(Laravel は数十 MB 規模) |
| PSR 準拠 | PSR-7 / PSR-11 / PSR-15 / PSR-17 |
| ルーティング | FastRoute(高速 Trie ベース) |
| ミドルウェア | onion / queue モデル両対応 |
| DI コンテナ | PHP-DI / Pimple など任意 |
| テンプレート | Twig / Plates をプラグインで追加 |
| ORM | 無し。Eloquent / Doctrine を別途 |
| 現行バージョン | Slim 4.x(PHP 7.4 / 8.x) |
インストール
Composer で Slim 本体と PSR-7 実装、DI コンテナを入れます:
mkdir my-slim-app && cd my-slim-app
composer init -n
# Slim 本体
composer require slim/slim:"^4"
# PSR-7 実装(どれか1つ)
composer require slim/psr7 # Slim 純正
# composer require nyholm/psr7 nyholm/psr7-server # 軽量
# composer require guzzlehttp/psr7 # Guzzle
# DI コンテナ
composer require php-di/php-di
# 開発支援
composer require --dev phpunit/phpunit
Hello World
最小構成の public/index.php:
addErrorMiddleware(true, true, true);
// ルート定義
$app->get('/', function (Request $req, Response $res) {
$res->getBody()->write('Hello, Slim!');
return $res;
});
$app->get('/users/{id:[0-9]+}', function (Request $req, Response $res, array $args) {
$payload = json_encode(['id' => (int)$args['id'], 'name' => 'taro']);
$res->getBody()->write($payload);
return $res->withHeader('Content-Type', 'application/json');
});
$app->run();
起動:
php -S localhost:8080 -t public
# http://localhost:8080/ → Hello, Slim!
# http://localhost:8080/users/42 → {"id":42,"name":"taro"}
ルーティング
// HTTP メソッド別
$app->get('/items', $listAction);
$app->post('/items', $createAction);
$app->put('/items/{id}', $updateAction);
$app->patch('/items/{id}', $patchAction);
$app->delete('/items/{id}',$deleteAction);
$app->any('/webhook', $webhookAction);
// グループ化(プレフィックス + 共通ミドルウェア)
$app->group('/api/v1', function ($group) {
$group->get('/users', UserListController::class);
$group->get('/users/{id}', UserShowController::class);
$group->post('/users', UserCreateController::class);
})->add(new AuthMiddleware());
// パラメータの正規表現制約
$app->get('/posts/{slug:[a-z0-9-]+}', $postShow);
ミドルウェア (PSR-15)
Slim 4 は PSR-15 標準のミドルウェアをサポート。複数を「玉ねぎ」状に積み重ねます:
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface as Handler;
class AuthMiddleware implements MiddlewareInterface
{
public function process(Request $request, Handler $handler): Response
{
$token = $request->getHeaderLine('Authorization');
if (!str_starts_with($token, 'Bearer ')) {
$response = new \Slim\Psr7\Response(401);
$response->getBody()->write(json_encode(['error' => 'unauthorized']));
return $response->withHeader('Content-Type', 'application/json');
}
// 認証 OK → 次へ
$request = $request->withAttribute('user_id', verifyToken($token));
return $handler->handle($request);
}
}
// 適用
$app->add(new AuthMiddleware()); // 全ルート
$app->get('/me', $meHandler)->add(new AuthMiddleware()); // 単一ルート
DI コンテナ + コントローラ
use DI\Container;
use Slim\Factory\AppFactory;
$container = new Container();
$container->set(UserRepository::class, function () {
return new UserRepository(new \PDO('mysql:host=localhost;dbname=app', 'root', ''));
});
AppFactory::setContainer($container);
$app = AppFactory::create();
// コントローラに DI 注入
class UserShowController {
public function __construct(private UserRepository $repo) {}
public function __invoke(Request $req, Response $res, array $args): Response {
$user = $this->repo->find((int)$args['id']);
$res->getBody()->write(json_encode($user));
return $res->withHeader('Content-Type', 'application/json');
}
}
$app->get('/users/{id}', UserShowController::class);
Eloquent / Doctrine の組み合わせ
Slim 自体に ORM は無いので、好みで選択します:
# Eloquent (Laravel の ORM) を使う
composer require illuminate/database
# Doctrine ORM を使う
composer require doctrine/orm symfony/cache
# CycleORM
composer require cycle/orm// Eloquent 初期化
use Illuminate\Database\Capsule\Manager as Capsule;
$capsule = new Capsule();
$capsule->addConnection([
'driver' => 'mysql', 'host' => 'localhost',
'database' => 'app', 'username' => 'root', 'password' => '',
'charset' => 'utf8mb4',
]);
$capsule->setAsGlobal();
$capsule->bootEloquent();
// Model
class User extends \Illuminate\Database\Eloquent\Model {}
// ルートで使う
$app->get('/users', function ($req, $res) {
$res->getBody()->write(User::all()->toJson());
return $res->withHeader('Content-Type', 'application/json');
});
Slim Skeleton(推奨スタートテンプレート)
# 公式スケルトン(PHP-DI + Monolog + PHPUnit 同梱)
composer create-project slim/slim-skeleton my-app
cd my-app
composer start
# → http://localhost:8080
# ディレクトリ構成
# app/ : 設定 / DI / ルート / ミドルウェア
# public/ : index.php (フロントコントローラ)
# src/ : アプリケーションコード
# tests/ : PHPUnit
Laravel / Lumen / Symfony との比較
| フレームワーク | 規模 | 特徴 | 典型用途 |
|---|---|---|---|
| Slim 4 | マイクロ | PSR 準拠、自由度高、組み立て要 | REST API / マイクロサービス |
| Laravel Lumen | マイクロ | Laravel 互換、開発鈍化 | Laravel 互換 API |
| Mezzio (旧 Zend Expressive) | マイクロ | PSR-15 専用、Laminas | エンタープライズ API |
| Laravel | フルスタック | Eloquent / Blade / Queue 同梱 | Web アプリ全般 |
| Symfony | フルスタック | Bundle / Doctrine、欧州で主流 | 大規模・長期保守 |
| CodeIgniter 4 | 軽量フル | シンプル MVC、学習用途 | 中小規模 Web |
API 専用なら Slim が刺さるシーン
- SPA / モバイルアプリのバックエンド APIのみ
- 既存サービスへのマイクロサービス追加
- Lambda / Cloud Run 等でのサーバーレス API(コールドスタートが速い)
- レガシー PHP からの段階移行。フロントだけ Slim でルーティング
- 社内ツール向けの 軽量管理画面 API
FAQ
Q: Slim と Laravel、どちらを選ぶべき?
A: 「画面付き Web アプリ」なら Laravel、「API のみ・低レイテンシ重視」なら Slim。学習コストは Slim の方が低いが、自分でライブラリ選定が必要です。
Q: Slim 3 と Slim 4 の違いは?
A: Slim 4 でPSR-15 ミドルウェアと PSR-17 ResponseFactoryに全面準拠、DI コンテナの取り出し方も変わりました。Slim 3 はサポート終了済みなので 4 を使ってください。
Q: 認証はどう実装する?
A: Bearer Token ならfirebase/php-jwt、セッションベースなら aura/auth / tuupola/slim-jwt-auth 等のミドルウェアを組み合わせます。
Q: パフォーマンスはどれくらい違う?
A: 単純な「Hello World」では Slim が Laravel の 5〜10 倍速(リクエスト/秒)出ますが、実運用では DB が支配的なので差は縮みます。