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

タイトル: Flight
SEOタイトル: Flight (PHP マイクロフレームワーク) 完全ガイド

この記事の要点
  • Flightシンプルさを徹底した PHP マイクロフレームワーク
  • Flight::route("GET /user/@id", ...) のような直感的ルーティング
  • 依存ゼロ。Composer 1 行 (flightphp/core) でインストール
  • Slim / Lumen に近い立ち位置。シンプル API、CLI ツール、プロトタイプ用
  • 最新はv3 系 (PHP 7.4+ / 8.x 対応)、活発度は控えめだがメンテ継続中

Flight とは

Flight は 2011 年から開発が続く PHP の超軽量マイクロフレームワーク。「とにかくシンプルに、素早く」をモットーに、Sinatra (Ruby) や Express (Node.js) を意識した API を持ちます。依存パッケージゼロで動き、コア機能はルーティングと最低限のレスポンス出力のみ。それ以外は必要に応じて自分で組み立てます。

主な特徴

項目内容
言語要件PHP 7.4+ (v3 系。v2 は PHP 5.3+)
サイズコア数十 KB
依存なし (PSR 各種も任意)
ルーティングシンプル + 名前付きパラメータ
ビュー素の PHP テンプレート (Latte / Twig 等とも併用可)
DI静的レジストリ (Flight::set / Flight::get)
ライセンスMIT

インストール

mkdir myflight && cd myflight
composer require flightphp/core

# プロジェクト構造例
# .
# ├── composer.json
# ├── public/
# │   └── index.php
# └── vendor/

Hello World

data->email;
    // 認証処理...
    Flight::json(['ok' => true]);
});

Flight::start();

開発サーバ起動

# 内蔵サーバを使う
php -S localhost:8000 -t public

# → http://localhost:8000/ → "Hello, Flight!"
# → http://localhost:8000/user/123 → "User: 123"

ルーティング

// 静的ルート
Flight::route('GET /about', function () { echo 'About'; });

// パラメータ
Flight::route('GET /posts/@id', function ($id) { /* ... */ });

// 複数パラメータ
Flight::route('GET /@year/@month/@day', function ($y, $m, $d) { /* ... */ });

// 正規表現でパラメータ制約
Flight::route('GET /posts/@id:[0-9]+', function ($id) { /* ... */ });

// 任意 (?)
Flight::route('GET /page(/@num)', function ($num) {
    $num = $num ?? 1;
});

// メソッド複数指定
Flight::route('GET|POST /form', function () { /* ... */ });

// グループ化
Flight::group('/api/v1', function () {
    Flight::route('GET /users', function () { /* ... */ });
    Flight::route('GET /users/@id', function ($id) { /* ... */ });
});

レスポンス

// 直接 echo
Flight::route('GET /text', function () { echo 'plain'; });

// JSON
Flight::route('GET /api/users', function () {
    Flight::json([
        'data' => [
            ['id' => 1, 'name' => 'taro'],
            ['id' => 2, 'name' => 'jiro'],
        ]
    ]);
});

// JSONP
Flight::route('GET /jsonp', function () {
    Flight::jsonp(['x' => 1]);
});

// テキスト (任意ステータス)
Flight::route('GET /err', function () {
    Flight::response()->status(404)->write('Not Found')->send();
});

// リダイレクト
Flight::route('GET /old', function () {
    Flight::redirect('/new', 301);
});

// ファイル送信
Flight::route('GET /download', function () {
    Flight::response()
      ->header('Content-Type', 'application/pdf')
      ->header('Content-Disposition', 'attachment; filename=report.pdf')
      ->sendHeaders();
    readfile('/path/to/report.pdf');
});

ビュー / テンプレート

// views/hello.php

Hello, !

// index.php Flight::set('flight.views.path', __DIR__ . '/views'); Flight::route('GET /hello/@name', function ($name) { Flight::render('hello.php', ['name' => $name]); }); // レイアウト風: ヘッダ+本体+フッタ Flight::route('GET /', function () { Flight::render('header.php'); Flight::render('home.php', ['title' => 'Top']); Flight::render('footer.php'); });

DI / レジストリ

// インスタンスを登録
Flight::set('db', new PDO('mysql:host=localhost;dbname=mydb', 'u', 'p'));

// メソッドを登録
Flight::map('hello', function ($name) {
    echo "Hello, $name!";
});

// クラスを登録 (lazy)
Flight::register('logger', 'MyLogger', ['/var/log/app.log'], function ($log) {
    $log->setLevel(Logger::DEBUG);
});

// 取得 / 利用
$pdo = Flight::db();
Flight::hello('Taro');
Flight::logger()->info('boot');

フィルタ / ミドルウェア相当

// ルートメソッドの前後にフックを掛ける
Flight::before('start', function () {
    // 全リクエスト共通の前処理 (認証など)
    if (!isset($_SESSION['user']) && Flight::request()->url !== '/login') {
        Flight::redirect('/login');
        exit;
    }
});

Flight::after('start', function () {
    // 全リクエスト共通の後処理 (アクセスログ等)
});

// 特定メソッド (Flight::map / Flight::register したもの) にもフック可能
Flight::before('hello', function (&$params, &$output) {
    // $params をいじって本処理を変えられる
});

エラーハンドリング

// 404
Flight::map('notFound', function () {
    Flight::response()->status(404)->write('Custom 404');
});

// 例外
Flight::map('error', function (Throwable $ex) {
    error_log($ex->getMessage());
    Flight::response()->status(500)->write('Internal Error');
});

Slim / Mezzio との比較

項目FlightSlim 4Mezzio
API スタイル静的呼出 (Flight::)OO / PSR-15OO / PSR-15
PSR 準拠限定的PSR-7/11/15PSR フル準拠
DI静的レジストリPSR-11 コンテナPSR-11 + Service Manager
ミドルウェアbefore/after フックPSR-15 標準PSR-15 標準
学習コスト中-高
活発度低-中
用途個人ツール / プロトタイプREST API / マイクロサービスエンタープライズ

向く / 向かないケース

○ 向く:

  • 1 ファイルで完結する API モック / Webhook 受け口
  • 個人ブログやポートフォリオの静的 + 動的少々 サイト
  • CLI ツールの薄い HTTP I/F
  • 学習用 (PHP の素を理解しつつフレームワーク機能も学びたい)

× 向かない:

  • 業務システム (DI / ORM / 認証 / 認可 / マイグレーションをフレームワークに任せたい)
  • チーム開発で規約と Laravel エコシステムに頼りたい
  • PSR-15 ミドルウェアスタックを前提とするプロジェクト

2026 年時点の活発度

  • GitHub flightphp/core はメンテ継続
  • 最新は v3 系 (PHP 8.x 対応)
  • スター数は数千。Laravel / Slim と比べると小規模
  • 日本語情報は少なめ、英語ドキュメントを読む前提

FAQ

Q: Flight で本格的な業務システムを作っていい?
A: 可能だが推奨しない。認証 / ORM / マイグレーション / キュー等を自前 or 他ライブラリで組む手間が大きく、Laravel を選んだ方がトータルコストが低い。

Q: PSR-7 を使いたい
A: Flight のコアは PSR-7 非対応。PSR-15 ミドルウェアを使いたい場合は Slim や Mezzio を選ぶのが筋。

Q: 静的呼出 Flight:: はテストしづらい?
A: 単体テストはやや書きにくい。ロジックを別クラスに切り出し、コントローラ部分のみ Flight に委ねるのが定石。