この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:5
ページ更新者:atom
更新日時:2026-06-11 07:12:00

タイトル: Slim
SEOタイトル: Slim Framework 完全ガイド|PHP マイクロフレームワークで API / マイクロサービスを最速構築

この記事の要点
  • Slim Framework は PHP の代表的なマイクロフレームワーク。HTTP ルーティングとミドルウェアに特化
  • PSR-7 (HTTP メッセージ) / PSR-15 (ミドルウェア) / PSR-11 (DI コンテナ) 準拠
  • Laravel / Symfony より圧倒的に軽量。コアは数百 KB レベル → REST API / マイクロサービス用途で人気
  • 現行は Slim 4 (PHP 7.4+ / 8.x 対応)。ORM はバンドルされず Eloquent / Doctrine を自分で組み合わせる
  • 類似の選択肢: Laravel Lumen (開発停止寄り) / Mezzio / Symfony Microkernel

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:

<?php
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;

require __DIR__ . '/../vendor/autoload.php';

$app = AppFactory::create();

// エラーミドルウェア(開発中は true 推奨)
$app->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 → {&quot;id&quot;:42,&quot;name&quot;:&quot;taro&quot;}

ルーティング

// 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 が支配的なので差は縮みます。