モデルのAutoLoad

http://d.hatena.ne.jp/noopable/20090224/1235429939
昨日、プラグインローダーでモデルをロードするっていう話を書いたばかりだけれど、MLで、ZF1.8に入るのか入らないのか、Zend_Application_Module_Autoloaderの話題が出ていた。
これを使うと

<?php
 $model = $loader->getModel('Item');

こんな感じで適切なモデルをロードできる。コンストラクタオプションなしでインスタンスを返してくるようなので要注意。
もしくは、直接ロードできるのだろうか。

<?php
 $model = new Module_Model_Item;

これは、autoLoaderが一度設定してあれば、他のモジュールからでも呼べる機構になるはず。loader自体を個別に書かなくてよくなる。

簡素化かプラガブルか

クラス名を直接書けば、includeしなくてよいという目的なら、autoloadはコーディングの簡素化になる。一方、呼び出し時にloaderを注入して使うような書き方にすれば、VCとMを分離してプラガブルなモデルを実装できそうだ。

Zend_Loader_Autoloader_Resource

Zend_Loader_Autoloader_Resourceというリソース毎のautoloadを定義できる仕組みを利用して、モジュール毎にautoload用の名前空間を使い分けられるようにしているっぽい。
もう一つでる予定になっている、モジュール毎のbootstrapを使うと、いよいよアプリケーション実装のひな形が完成に近づいてくるという雰囲気でしょうか。

Zend_Loader_Autoloader_Resourceが出るかでないかわかりませんが、これから作るモジュール内ディレクトリ構成はこのクラスと同じ形式にしておく方が無難かもしれない。まぁ、incubatorだから仕様変更は起きるかもしれないけど。
構成としては、こんな感じ。incubatorおもしろいw

<?php
array(
            'dbtable' => array(
                'namespace' => 'Model_DbTable',
                'path'      => 'models/DbTable',
            ),
            'form'    => array(
                'namespace' => 'Form',
                'path'      => 'forms',
            ),
            'model'   => array(
                'namespace' => 'Model',
                'path'      => 'models',
            ),
            'plugin'  => array(
                'namespace' => 'Plugin',
                'path'      => 'plugins',
            ),
            'api' => array(
                'namespace' => 'Api',
                'path'      => 'apis',
            ),
        )