LoginSignup
6
5

More than 3 years have passed since last update.

Composerとか入れたくないので簡単に使えるフレームワークを作った

Posted at

そういえば僕も3ヶ月くらい前にComposerとかに依存したくなくて1ファイルで完結するフレームワークを作ってた。ソースコードはzonuexe/hogephpにある。

こういう雰囲気でコードが書ける。

index.php
<?= (require __DIR__ . '/../Hoge.php')(function (Hoge\Framework $php) {
    $php->get('/', function () { ?>
<!DOCTYPE html>
<html>
<title>Hoge index</title>
<h1>The Hoge PHP Framework</h1>
</html>
    <?php });
}) ?>

トップページのルーティングしか定義していないが、これで起動スクリプトのコード全部だ。ほかにディスパッチ処理などのボイラープレートは要らない。

たわむれに作ったものなのでセキュリティは万全に考慮できているわけではない。

コンセプト

  • フレームワーク本体は1ファイルで完結する
  • ユーザーに無駄なボイラープレートは書かせない
  • 副作用を容易に分離可能にし、ユニットテスト可能にする

最後の項目はまだ実装してないのだけれど、実際簡単にできる。

ファイル配置

.
├── Hoge.php ← フレームワーク本体
└── public ← ドキュメントルート
    ├── .htaccess ← Apacheの設定ファイル
    ├── favicon.ico ← 静的ファイル
    └── index.php ← 起動スクリプト

PHPのビルトインHTTPサーバで起動するにはphp -S localhost:3939 sample/index.php -t sampleだ。

テンプレートエンジン

そんなものはない。PHPはテンプレートエンジンだ。

ルーティング

GET /phpinfo というルーティングを追加したければ、こうする。

    $php->get('/phpinfo', function () {
        phpinfo();
    });

ルーティングに登録する関数は「HTMLを出力する」か「[int $status, array<string,string|array<string>> $headers, string $body]の形式の配列を返す」か、どちらか。

3ヶ月前に書いた時点ではだるかったので静的ルーティングしか対応していなかった。超簡易ルーターを作成しました。*を使ったパターンの書きかたがおもしろかったので、暇なときに真似しようと思う。

それはそうと、パラメータを埋め込める動的ルーティングも半年くらい前に一度実装したらあまり難しくなかった。

今後の展望

  • PDOを統合して簡単に使いたい気がする
  • この形式ではPSR-7と同じくsetcookie相当の操作がしにくいのでヘルパー関数を提供したい気がする

このまま忘れてしまう可能性も高い気がしますね。。。

おまけ: いままで作ったやつ

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5