あっぽログ
← 記事一覧に戻る

SlimフレームワークでREST APIを作る:ルーティング・ミドルウェア・JSONレスポンスの基本

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のルーティングは非常に直感的です。GETPOSTPUTDELETEなど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のバックエンドや小規模なサービスに、ぜひ活用してみてください。

← 記事一覧に戻る