技術日記
Zend Framework 0.2.0調査メモEdit

0.2.0のアーカイブをながめながら、気になったところをメモ。

Zend_Cacheがincubatorからlibraryに格上げされている。incubatorの頃から使っているんで、特に俺的には新鮮みはないけれども、一応まとめておく。キャッシュの利用方法を規定するFrontendと、キャッシュの格納方法を規定するBackendの二つのクラスで構成される。Frontendはクラスのメソッド呼び出しをキャッシュするZend_Cache_Frontend_Class、ファイルの読み込みをキャッシュするZend_Cache_Frontend_File、関数呼び出しをキャッシュするZend_Cache_Frontend_Function、外部(HTML)出力をキャッシュするZend_Cache_Frontend_Output、ページ単位の出力をキャッシュするZend_Cache_Frontend_Page(Outputキャッシュとほとんど同じで、キャッシュIDをURL等から自動生成する)が用意されている。BackendはファイルキャッシュのZend_Cache_Backend_File、APCを使ったメモリキャッシュのZend_Cache_Backend_APC、memcachedを使ったメモリキャッシュのZend_Cache_Backend_Memcached、SQLiteを使ったZend_Cache_Backend_Sqliteが用意されている。ただしAPCとMemcachedはタグ機能がサポートされていないんで、機能限定版だと思っておいた方がいい。ちなみに自分ではMySQLバックエンドを書いて使っている。

Zend_Configもincubatorからlibraryに格上げされている。階層構造を持つ設定情報を、PHPのstdclassでプロパティアクセスするようなインターフェースにマッピングして扱えるようにするクラス。連想配列なんかよりも扱いやすくて便利そうなんだけど、データソースとして現状でINIファイル、XMLファイル、PHPの連想配列にしか対応していないんで使ってない。Spycとかのラッパーを書いてYAML対応してもいいんだけど、それならSpycをそのまま使ったって別にかまわないしなー。

ルーターは、Zend_Controller_RewriteRouterがlibraryに格上げされている。ってのは0.1.4からだっけ? RewriteRouter自体は悪くないんだけど、これの完成度が上がる前に、自前で似たようなルーターを書いちゃったから今のところ使ってない。将来的なメンテナンス性とかを考えると、そのうちRewriteRouterに乗り換えるかもしれないけど。RewriteRouterは機能的にはあまり文句はないんだけど、YAMLで設定を書けないところが面倒くさいよなー。っつーか、Zend Frameworkは早いところYAML対応して欲しいなー。ゼロから書き起こす縛りがなければ、YAML対応するのなんて簡単だろうに。

Zend_Http_Clientは、昔incubatorで開発されていたバージョンは没になって、構成がずいぶん変更されているっぽい。Zend_Http_Requestが導入されたんで、Zend_Http_Client本体を高機能に拡張するのはやめて、Zend_Http_Client、Zend_Http_Request、Zend_Http_Responseで役割を分割するようにしたのかな。っつーことは、旧incubatorバージョンを採用していた俺のコードは、すべて書き直す必要がありそうだ……。まあどちらにしろ、Zend_Http_Request対応する必要があるから、そのあたりは大規模に書き換える必要があるけど。

ちなみにincubatorではコントローラ周りにも結構大きな仕様変更が行われつつある。ルーティング結果を保持するZend_Controller_Dispatcher_Tokenがなくなり、代わりにZend_Controller_Request_Httpが採用される。これは、従来のTokenと同様にURLから解決されたコントローラ名、アクション名、パラメータを保持するだけでなく、$_GET、$_POSTなどの入力値も管理する機能を持つ。今まではURLから解決できる値はTokenが持ち、それ以外の入力値はZend_Filter_Inputあたりを使って解決するという、中途半端な仕様になっていたんだけど、Zend_Controller_Request_Httpが導入されることによって、ようやく入力値を統一的に扱うことができるようになる。また、こうやって入力値を統一的に扱うことができるようになると、アクションレイヤーのテストなんかで仮想的なRequestを渡してテストを実行できるようになったりするんで、そういう意味でも便利。ちなみにZend_Controller_Request_HttpはZend_Http_Requestを内部にもっているんで、その辺が前段落の話とつながってくる。ちなみに俺ルーターはすでに同様の機能を持っちゃってるのが、今後Zend Framework本家版に合流するのを難しくしてしまっている。

Zend_Aclはまだincubator止まりだな。これはいつになったら格上げされるんだろう? ちなみにZend_Aclの構成としては、アクセス制御される対象物を管理するACL(Zend_Acl。$acl = new Zend_Acl();)と、アクセスを行う実行者グループを管理するARO(Zend_Acl_Aro。$aro = $acl->aroRegistry();)があり、まずAROとして実行者グループを登録し($aro->add('somegroup'); // somegroupというグループを登録。$aro->add('someperson', $aro->somegroup); // somegroupに所属するsomepersonを登録)、続いてACLにどの対象物に対してどのAROがどういう権限を持つか設定していく($acl->deny(); // デフォルトは拒否。$acl->someobject->allow('somegroup'); // someobjectという対象物に対してsomegroupのアクセスは許可する。$acl->someobject->somepart->deny('someperson'); // someobjectの一部であるsomepartに対してsomepersonのアクセスを拒否する)。権限は基本的には許可(allow)と拒否(deny)だけど、対象物+アクションに対して権限を設定することもできる($acl->someobject->deny('somegroup', 'hit'); // 叩いちゃダメ)。で、実際にアクセス権があるかどうかはvalidメソッドでテストする(if ($acl->someobject->valid('someperson') { // アクセス権がある } )。

ZFormは進展なしな模様。っつーかいまだに命名規則すらZend_Formになってないし。

Zend_Json_Serverとかいうものがincubatorに入っているな。っつーかこれは、Zend_Serverってのが増えた中の実装の一つか。XMLRPCサーバーとかSOAPサーバーとかを書くためのZend_Serverってのができて、その実装の一つとしてJSONサーバーがあるのね。コードを読んだ限りでは、$_REQUEST['method']で実行したいメソッド名を渡し、$_REQUEST内からメソッド引数を抽出し、サーバーに登録されているメソッドだったらそのメソッド+引数を実行。結果はapplication/jsonとして出力するって感じらしい。こういう仕様のJSONサーバーって、どこかで規格化されていたりするのかな? RESTサーバーの返しはXMLになっている模様。SOAPとXMLRPCはまあちゃんと規格があるからコードは読まなくていいだろう。

Zend_Sessionもincubatorに入っている。ネームスペースの導入、バリデーションの共通インターフェース、時間もしくは回数による有効期限設定あたりが主な拡張かな。セッションハンドラーを拡張するインターフェースは用意されているけれども、まだハンドラーの実装はない模様。有効期限については、1回有効期限のセッションを利用すれば、RoRとかのFlashみたいな使い方ができるな。

ってあたりを押さえておけば、0.1.4から0.2.0へのアップデートに関してはだいたい大丈夫かな? その他の修正やアップデートに関しては、実際に使ってみた何かあったらチェックしよう。

Published At2006-11-21 00:00Updated At2019-12-31 00:03