PHP らしく書ける、軽量で高速なフレームワーク
Flexagon は軽量で高速な PHP Web フレームワークです。複雑な抽象化よりも PHP 本来のシンプルさを活かし、規約を最小限に抑えることで、アプリケーションをすばやく構築できます。
composer create-project flexagon/skeleton myapp
<?php
// public/hello.php → https://example.com/hello
_Global::$SITE_TITLE = 'Hello';
TemplateLoader::show('head');
?>
<h1>Hello, Flexagon</h1>
<p>Pages are plain PHP files. Their path is their URL.</p>
<?php
TemplateLoader::show('tail');
- 0
- 実行時依存関係
- 1.09ms
- フレームワーク起動
- 2MB
- 起動時メモリ
- 237KB
- 単一の PHAR ファイル
設計原則
PHP を知っていれば、すぐに始められます
ページは .php ファイル、ビューは PHP と HTML で直接書き、データベースには使い慣れた SQL をそのまま使えます。開発を始める前に、ルーティング構文やサービスコンテナ、クエリ DSL を覚える必要はありません。
シンプルで柔軟なルーティング
ファイル構造がそのまま URL 構造になるため、ルーティングが直感的で明快です。
リクエストごとの独立した実行
リクエストごとに不要な状態を残さないため、動作が安定し予測しやすくなります。
PHP らしいシンプルな開発
独自のテンプレート言語を使わず、PHP 本来の書き方で開発できます。
書く量は少なく、見通しは良く
ひと目で読めるコード
- URL はそのままファイルパスです。 管理すべきルーティングテーブルはありません。URL を見れば、どのファイルが実行されるかがわかります。
- スキーマの基準はデータベースです。 DAO は最初のクエリでカラムと主キーの情報を読み取るため、スキーマを PHP 側に重複して定義する必要がありません。
- グローバル設定は明示的に。 設定は静的クラス _Global に集約されています。設定との間に DI コンテナはありません。IDE で _Global:: と入力すれば補完で一覧できます。
- リクエストごとのオーバーヘッドは最小限。 起動処理は定数の定義、オートローダーの登録、設定の読み込みだけです。必要になるまで何も生成しません。
application/ExampleUser/UserDAO.php
<?php
namespace ExampleUser;
use _Flexagon\Base\BaseMySqlDAO;
class UserDAO extends BaseMySqlDAO {
protected string $tableName = 'users';
public function insert(UserModel $user): int|false {
return $this->_insert($user);
}
public function findById(int $id): ?UserModel {
return $this->_select(['id' => $id], new UserModel());
}
/** @return UserModel[] */
public function findByCity(string $city, int $page = 1): array {
return $this->_selectList(
new UserModel(), $page, 20,
'`address` = :CITY', ['CITY' => $city],
'`created_at` DESC'
);
}
}
application/ExampleUser/UserModel.php
<?php
namespace ExampleUser;
use _Flexagon\Base\BaseModel;
class UserModel extends BaseModel {
private ?int $id = null;
private string $name;
/** @encrypt */
private string $residentNumber = '';
public function getId(): ?int { return $this->id; }
public function setId(?int $id): void { $this->id = $id; }
public function getName(): string { return $this->name; }
public function setName(string $name): void { $this->name = $name; }
// Columns map to getters: resident_number → getResidentNumber()
}
application/_Config.php
<?php
use _Flexagon\Libs\Env;
use _Flexagon\Models\DataSourceModel;
// Secrets come from .env.php or the environment, never from this file.
_Global::$DATA_SOURCES['default'] = new DataSourceModel(
Env::get('DB_HOST', 'localhost'),
Env::int('DB_PORT', 3306),
Env::get('DB_USER'),
Env::required('DB_PASSWORD'),
Env::get('DB_NAME')
);
_Global::$SESSION_AUTO_START = true;
_Global::$SESSION_ENCRYPTION_STRING = Env::required('SESSION_ENCRYPTION_STRING');
軽く、速く
軽いフレームワークで、速い Web アプリケーションを
同じ環境で、Flexagon は 1.09 ms、メモリ 2 MB、ファイル 15 個でリクエストを処理する準備が整います。Laravel は 12.85 ms、20 MB、ファイル 336 個が必要です。フレームワークが軽く速い分、その上で作る Web アプリケーションにも高いパフォーマンスが期待できます。
インストールサイズは実行時依存関係なしの 532 KB で、Laravel の 42 MB・77 パッケージと比べてはるかに小さく、237 KB の PHAR ファイル 1 つでデプロイできます。デプロイ先のサーバーには Composer もキャッシュのウォームアップも不要です。
| Flexagon 3.5.0 | Laravel 13.26.1 | |
|---|---|---|
| 実行時依存関係 | 0 | 77 パッケージ |
| インストールサイズ | 532 KB | 42 MB |
| 起動時間 | 1.09 ms | 12.85 ms |
| 起動時メモリ | 2 MB | 20 MB |
| 起動時に読み込むファイル数 | 15 | 336 |
本当に必要な機能は標準で
Web アプリケーションに必要なものだけを
はじめる
3 ステップで最初のページを動かす
1
プロジェクトを作成
composer create-project flexagon/skeleton myapp
cd myapp
2
ページを追加
<?php
// public/hello.php
TemplateLoader::show('head');
echo '<h1>Hello, Flexagon</h1>';
TemplateLoader::show('tail');
3
実行
docker compose up -d
php script/flexagon.php check
# open http://localhost:8080/hello