PHP らしく書ける、軽量で高速なフレームワーク

Flexagon は軽量で高速な PHP Web フレームワークです。複雑な抽象化よりも PHP 本来のシンプルさを活かし、規約を最小限に抑えることで、アプリケーションをすばやく構築できます。

composer create-project flexagon/skeleton myapp

PHP 8.3+ MIT ライセンス 実行時依存関係ゼロ

public/hello.php
<?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

PHP を、PHP らしく。

Flexagon は MIT ライセンスの無料オープンソースです。