ページに戻る
-#?diaryanchor -e Picowa+ #?diaryanchor Picowa &[Picowa][PHP] |< 少し前から[[Picowa]]という名前の小さなフレームワークを作っていました。 Sinatra風味で、PHP5.2以降で動作。 元々[[Fitzgerald|http://github.com/jim/fitzgerald]]というとっても小さなフレームワークを、[[anatoo氏のCurry,Quotationライブラリ|http://d.hatena.ne.jp/anatoo/20090402/1238603946]]と親和する形にいじっていたのですが、だんだんと別物に育ってきたので公開してみた、というのが正しい気がします。 Fitzgeraldでは、正規表現でマッチしたルートに対して呼び出されるのはアプリケーションオブジェクトのメソッドに限られていましたが、Picowaでは任意のコールバックを指定できます。 PHP5.3以降なら無名関数を渡せるはずなので、いっそうSinatra風味に。 フィルタが強力なのも特徴の一つです。 正規表現でマッチしたルートに対して複数の独立したbefore/around/afterフィルタを指定できます。 既存のコードに手を加えず、特定のルートに対してbeforeフィルタで認証をつけるとか、aroundフィルタでまるごとページを置き換えてしまうとか、afterフィルタでサイト全体に含まれる特定の文字列を置換してしまうとか、そういった利用が可能になるはずです。 (といっても認証コンポーネントとかは提供してませんけど。) PHPのフレームワークでは、Rubyのmixinを模したようなpluginなどの仕組みを、__callをトリガにしたメンバオブジェクトへの委譲で実現しているものをよく見かけるのですが、Picowaにはありません。 そうした理由はいくつかあります。 ひとつはメソッド名の衝突を気にして長いメソッド名を付けるぐらいなら、直接、メンバオブジェクトにアクセスしたらええやん、というもの。 + >| $obj->veryLongPluginMethodName(); $obj->Plugin->methodName(); + |< もうひとつは、method_existsなど使って事前にメソッドの有無を判定しようとしたら、eagerにクラスファイルを読むしかないよな気がすること。(なんてこったい) それじゃautoloadの利点が半減してしまいますよね。 Picowaでは最初のメンバオブジェクトのアクセスまで、クラスファイルの読み込みと、インスタンス生成を遅延してくれる仕組みを用意しています。 それだけではなく、メンバオブジェクトのメソッドをコールバックとして取得する際に、コールバックが実際に実行される時点まで、クラスファイルの読み込みと、インスタンス生成を遅延させることができます。 + >| $callback = $obj->_Plugin->_methodName(); // まだこの時点ではPluginのクラスファイルは読み込まれない call($callback); // コールバックが実行されるとautoloadされる + |< Picowaではこの仕組みを利用することで、Sinatra風にルートとコールバックを紐付けつつ、最小限のクラスだけをautoloadにより読み込むことが可能になります。 PicowaはテンプレートエンジンやORMなどは用意していません。Fitzgeraldほどコンパクトではありませんが、小さなフレームワークです。 [[GitHub|http://github.com/no22/Picowa]]と[[BitBucket|http://bitbucket.org/no22/picowa]]で公開しています。 現在v0.1.0ですがこれ以上機能追加するつもりがありません。 でも更新するとなると普段Mericurial派なのでBitBucketのほうが最新になることが多いと思います。 自由にご利用&感想などいただけるとありがたいです。 >| #enddiary