そういえば僕も3ヶ月くらい前にComposerとかに依存したくなくて1ファイルで完結するフレームワークを作ってた。ソースコードはzonuexe/hogephpにある。
こういう雰囲気でコードが書ける。
<?= (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
相当の操作がしにくいのでヘルパー関数を提供したい気がする
このまま忘れてしまう可能性も高い気がしますね。。。
おまけ: いままで作ったやつ
- シンプルなルーティングがしたかった - Qiita
- インスパイヤされて掲示板を作りたくなった(3) - Qiita
-
PHP構築メモ: ライブラリのデモ用PHPアプリ - Qiita
- リバースルーティングの話とかもしてる
-
DocCommentでPHPのユニットテストの書きやすさを劇的に改善する手法
- リバースルーティングの話とかもしてる
- OiraPHP/riha-saru
-
phperkaigi-golf
- これはAura.Routerに依存している