2015年4月3日金曜日

ミドルウェアベースでPSR7を使った自作フレームワーク

相変わらずフレームワークを自作している。勉強になるし、万が一、いいものができたら実際に使ってみたいと思いながら作っている。今までは、勉強がメインだったが、今回は本当に使えそうな感じになってきた。

名前は「TuumPHP」。

作り始めたきっかけ

StackPHPとLaravel


2014年の夏頃、Laravel4.2で開発をしていて、これは楽に開発できるフレームワークだなぁと関心した。ただ自分の仕事だとアップデートについて行くのは難しいと感じていた。一旦作ったら、作り変えない程度の機能追加がたまにある程度で、数年は運用する必要がある。まぁなんとかなると思うけど。

そんな時、ミドルウェアとStackPHPについて調べてみて、これは素晴らしいと。単純な構造を組み合わせることで複雑なアプリを構築することができて、PHPの方向はこれだと思った。こんなエントリをQiitaにアップしている

StackPHPとミドルウェアについて調べてみた

つまり、

  • StackPHPのような簡潔な構造で、
  • Laravelのように開発しやすいくて、
  • データの流れが自然(ファサードとか使わない)、
  • できればバージョンアップもパッケージ別に対応可、

そんなフレームワークがほしいと思った。

ちょいと探したけれど、いいのが見つからず。じゃ、自分で作ってみるか、というのが始まり。

Psr-7の導入


作ってからしばらくして、標準のHTTPリクエストやレスポンスの規格がもうそろそろ完成するという話が流れてきた。Psr-7という規格。しかも不変オブジェクトが使われている、ときいて早速導入して見た。

その時の経験からQiitaに書いたのが、

Psr7を使ってみた(というか不変オブジェクトを初めて使った感想)


TuumPHPの特徴

余り思いつかないので、徒然と書いてみる。

マイクロフレームワーク+ビュー。
つまりSlimやSilexより少し機能が豊富なフレームワーク。モデル側(DB)などは持ってない。

マジックな機能


つまりLaravelから拝借した機能、ということですね。

  • フォームの入力エラーで、フォームにリダイレクトで戻るときに、入力値(withInputs)やバリデーションエラー(withErrors)などを一緒に返せる。
  • フォームに値を表示するときに、リダイレクトの戻り値(withInputs)を簡単に利用できる。
  • APIやメソッド名を参考に。

意外と少なかった。

ミドルウェア


なんでもミドルウェア。

ルーティングもミドルウェアなので、いくつでも追加できる。ルーティングの前のプリ・ルーティングも、ルーティング後のコントローラ内のポスト・ルーティングもできる。

ルーティングの後のディスパッチャーもミドルウェア。これも交換可能。

もちろんコントローラーもミドルウェアの一つ、ので、単純な継承でコントローラークラスを作れる。というか継承する必要は無いはず。

コントローラ内で簡易ルーティングができる。貧者のアノテーション・ルーティングですね。

状態


まだアルファ。
APIも含めて色々と変わる可能性は高い。

独立したコンポーネントを作っていて、こちらはドキュメントとテストはそこそこあるが、フレームワークとしてはドキュメントもテストもほぼ未着手。

その代わり、こんな文章を書いている。フレームワークの使い方ではなくて、どうしてこうなった?の理由を書いたほうが勉強になるかなと思ったから。


今後


すでにZend FrameworkもSlim Framework も次のバージョンでPsr-7でミドルウェアに対応すると表明している。。Laravel 5もすでにミドルウェアベースになっているし、次にはPsr-7を使ってくるのでは無いかと思う。

注目したいのは、今後のPHPで


よく使われるミドルウェアAPI


はどれか、という点。APIが同じなら互換性が高いため、コードやオブジェクトを共通して使える。例えばOAuthとかのクラスを使いまわせるかどうか、というのが大事。

もしフレームワークを自作するなら、APIの目安がついてからのほうがいいと思う。