Zend_Loader_PluginLoaderでモデルクラスをロードする

モデルをロードする一番てっとり速い方法は、直接require_onceする方法かもしれない。
しかし、コントローラーを跨いだ処理だったり、コントローラーやビューを抽象化しながらモデルを扱いたい場合、個別に検索パスをハードコーディングする方法はできれば避けたい。
そこで、とりあえずロード部分だけはプラグインローダーの仕組みでロードしてみることにした。

Zend_Loader_PluginLoaderを使うメリット

  • クラス検索パスを複数設定できる。
  • モデル用クラスファイルでプレフィックスを使い分けることができる。
  • ロードするクラス群をひとまとめにしてローダーを利用できる。
  • アプリケーションの初期化時にロード先の設定をし、コントローラーで再利用する際に必要なのはスタティック名だけ
  • パフォーマンス低下を軽減できる。マニュアル参照

※クラス名が特定できてれば、オートロードが使える。
※検索パスがその場で認識出来ている場合はプラグインローダーを使わず、Zend_Loaderで普通にロードできる。

その他もろもろあると思う。

具体的には

ローダーを作成しておく。使う前ならどこでもいい。アクションコントローラーの基底でもいいし、bootstrapでもいい。

<?php
$path = realpath(dirname(__FILE__) . '/../models');//たとえば
$loader = new Zend_Loader_PluginLoader(array('Model' => $path), 'modelSet1');
たとえばコントローラーで使う
<?php
//第2引数の指定を合わせることでスタティックに保存されたローダーを使うことができる。
//キーについてはレジストリに入れておくとか。
//$loaderはinit()等で$this->_loaderにセットしておいてもいい。
$loader = new Zend_Loader_PluginLoader(array(), 'modelSet1');
$itemClass = $loader->load('Item');
$ref = new ReflectionClass($itemClass);
$itemInstance = $ref->newInstance();

前提

<?php
// path/models/Item.php
class Model_Item{}

これを利用しようとしている動機は、
http://d.hatena.ne.jp/noopable/20090222/1235254651
ここで、言及したような、モジュールを多様な設定で使いたいときに、検索パスを積み重ねる方がわかりやすかったため。
実用を考えるなら、プラグインローダー単独で使うというよりも、モデル用のファサードを作ってそこに任せる感じかもしれない。

例外が微妙か

例外メッセージ

Uncaught exception 'Zend_Loader_PluginLoader_Exception' with message 'Plugin by name

# プラグインローダーって名前じゃなくてもいいのになぁ・・・

と、思ったら、1.8でおもしろいものが・・・
http://d.hatena.ne.jp/noopable/20090225/1235515965