9.

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

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. Laravel
  2. CakePHP
  3. Symfony
  4. Zend Framework (PHP フレームワーク)
  5. DietCake
  6. phalcon
  7. CodeIgniter
  8. FuelPHP
  9. Slim
  10. Flight
  11. Yii
  12. Silex

最近更新/作成されたページ