タイトル: Flight
SEOタイトル: Flight (PHP マイクロフレームワーク) 完全ガイド
| この記事の要点 |
|
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, = htmlspecialchars($name) ?>!
// 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 との比較
| 項目 | Flight | Slim 4 | Mezzio |
|---|---|---|---|
| API スタイル | 静的呼出 (Flight::) | OO / PSR-15 | OO / PSR-15 |
| PSR 準拠 | 限定的 | PSR-7/11/15 | PSR フル準拠 |
| 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 に委ねるのが定石。