10.

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

<?php
// public/index.php
require __DIR__ . '/../vendor/autoload.php';

Flight::route('GET /', function () {
    echo 'Hello, Flight!';
});

Flight::route('GET /user/@id', function ($id) {
    echo "User: " . htmlspecialchars($id);
});

Flight::route('POST /login', function () {
    $email = Flight::request()->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
<h1>Hello, <?= htmlspecialchars($name) ?>!</h1>

// 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 に委ねるのが定石。

編集
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

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