2

Zend フレームワーク。ブートストラップクラス内から、モデルフォルダー内のモデル クラスを自動ロードしたいと考えています。これらのモデルは実際には名前空間を使用しません (したがって、Ex. User.php ファイルの User という名前のクラスがあります..)。

私が正しく理解していれば、Zend_Loader_Autoloader_Resourceを使用する必要があり、試しました:

function _initLoaderResource() 
{         
    $resourceLoader = new Zend_Loader_Autoloader_Resource(array(                 
    'basePath'  => APPLICATION_PATH,//points to the "application" path where resides "models" folder
    'namespace' =>''       
    ));         

    $resourceLoader->addResourceType('models', 'models/');

} 

そして、次の「Zend_Loader_Exception」メッセージを受け取ります。

'Initial definition of a resource type must include a namespace' 

私の質問は次のとおりです。

  • これはモデルを自動ロードする正しい方法ですか?
  • Zend Framework コーディング標準に従っていないリソース コードはどのように管理すればよいですか?
4

2 に答える 2

5

実際には、これにリソースオートローダーを使用したくない場合があります。これは、(ご存知のとおり)名前空間が必要なためです。setFallbackAutoloader標準のオートローダー(インクルードパスからモデルをロードする)には、別の名前空間がカバーする名前空間と一致しないクラスにオートローダーを使用する必要があることをZFに通知するオプションがあります。したがって、必要なのは、モデルディレクトリがインクルードパス上にあることを確認し、このオプションをtrueに設定することだけです。

Zendクラスのロードにすでに標準のオートローダーを使用している可能性があるため、application.iniファイルを変更してモデルディレクトリをインクルードパスに追加してから、application.iniまたはでフォールバックオプションを設定することをお勧めします。ブートストラップクラス:

protected function _initAutoloader()
{
    $autoloader = Zend_Loader_Autoloader::getInstance();
    $autoloader->setFallbackAutoloader(true);

    return $autoloader;
}
于 2011-05-16T14:53:59.157 に答える
1

Zend Autoloader は名前空間を使用して、不要なクラスで autoload プロセスを使用していないことを確認します。したがって、クラスの名前空間を選択する必要があります。

アプリケーション固有の名前空間または一般的な名前空間でクラスを開始できます。「My_」や「App_」などの名前空間は一般的なものですが、たとえば、アプリケーション名が Job Board の場合、クラス ファイルで「JB_」などの名前空間を使用できます。

独自のオートローダ (まったく新しいもの、または Zend オートローダを拡張したもの) を作成し、それをSPL オートローダとして登録して、これをバイパスすることもできます。

クラス名は、Zend Framework の命名規則に従う必要はありません。名前空間があることを確認し、その名前空間をオートローダーに登録してください。

ここに、オートロードするリソースを登録するコードの一部を添付します。複数のモジュールがあり、各モジュールにはそのモジュール名に関する名前空間があります。名前空間がたくさんあったので、それらをすべてループで登録することに注意してください。

    $nameSpaceToPath = array(
                            'Application'   => APPLICATION_PATH,
                            'Base'          => APPLICATION_PATH . '/base',
                            'Store'     => APPLICATION_PATH . '/modules/Store',
                            'Payment'     => APPLICATION_PATH . '/modules/Payment',
                            'Admin'     => APPLICATION_PATH . '/modules/Admin'
                        );

    foreach($nameSpaceToPath as $ns => $path) {
        $autoLoaderResource = new Zend_Loader_Autoloader_Resource(
                            array(
                                'basePath' => $path,
                                'namespace' => $ns
                            )
                        );
        $autoLoaderResource->addResourceType('controller','controllers','Controller');
        $autoLoaderResource->addResourceType('model','models','Model');
        $autoLoaderResource->addResourceType('mapper','models/mappers','Model_Mapper');
        $autoLoaderResource->addResourceType('service','services','Service');
        // I'm using _Util_ in the name of my utility classes, I place them in 'utils' directory
        $autoLoaderResource->addResourceType('util','utils','Util');
        $autoLoaderResource->addResourceType('plugin','plugins','Plugin');
        $autoLoaderResource->addResourceType('form','forms','Form');
        // I'm using _Exception_ in the name of my module specific exception classes, I place them in 'exceptions' directory
        $autoLoaderResource->addResourceType('exception','exceptions','Exception');
        $autoLoader->pushAutoloader($autoLoaderResource);
    }

以下を呼び出してリソースタイプを定義する場合:

$autoLoaderResource->addResourceType('service','services','Service');

実際には Zend Autoloader に、'services' (2 番目のパラメーター) という名前のディレクトリに配置されたタイプ 'service' (1 番目のパラメーター) があり、クラスを指定するためにクラス名で' Service ' トークンを使用していることを伝えています。このタイプ。

上記のコードは、パス 'APPLICATION_PATH/modules/store/services/Core.php' でクラス Store_Service_Core を検索するように Zend Autoloader に指示します。

ご覧のとおり、APPLICATION_PATH パスの一般的な「アプリケーション」名前空間を登録しました。これは、Application_ で始まる各クラスが APPLICATION_PATH から自動ロードされることを意味します。たとえば、いくつかの初期化タスクを使用する Application_Init という名前のクラスがあり、Zend はパス APPLICATION_PATH/Init.php からそれを自動ロードします。

于 2011-05-15T18:07:48.580 に答える