3

Zend フレームワークを使用してプロジェクトを開発していますが、次の問題に遭遇しました。zf.sh スクリプトを使用して生成された Zend フレームワーク MVC フォルダー構造を使用しています。

ライブラリ フォルダには Zend ライブラリ フォルダがあり、そのクラスはアプリケーション内で通常どおり呼び出すことができます。クラス用にライブラリ内に別のフォルダーを作成しました。これは現在のフォルダー構造です。

私のプロジェクト

|
_application |_docs |
_public |
_library
           |_Zend
           |_Buyers
                     |_Donations.php
|_scripts

Zend フレームワークの命名規則に従って、Donation クラスに「Buyers_Donations」という名前を付けました。

コントローラー内でこのクラスを使用しようとしたとき

$obj= new Buyers_Donation(); 

コントローラー内でクラス Buyers_Donation が見つからないというエラーが発生しました。

しかし、Bootstrap に次の行を追加すると、機能しました。

$loader = Zend_Loader_Autoloader::getInstance();
$loader->setFallbackAutoloader(true);
$moduleLoder = new Zend_Application_Module_Autoloader(
array(
'namespace'=>'',
'basePath'=>dirname(__FILE__)
));

アプリケーションにモジュールがありませんが、実際に何が起こったのか、モジュールオートローダーの使用法を誰かが説明してもらえますか?

4

2 に答える 2

5

ご想像のとおり、モジュールを使用していないため、モジュール オートローダーを使用するべきではありません。Zend* クラスが適切に自動ロードされていると仮定すると、「Buyers」名前空間のクラスにも使用する必要があることを標準のオートローダーに指示するだけで済みます。したがって、投稿したコード スニペットの代わりに、次のようにします。

$loader = Zend_Loader_Autoloader::getInstance();
$loader->registerNamespace('Buyers_');

必要に応じて、これを application.ini で設定することもできます。

また、質問が示すように、クラスが public ディレクトリではなく、ライブラリ フォルダーにあると想定しています (これは悪いことです)。

于 2011-06-23T11:31:39.853 に答える
1

zend の自動ロード機能を使用したくない場合は、次のように、require_once() を使用して手動でファイルを含める必要があります。

 require_once 'Buyer/Donations.php';

独自の名前空間を使用する独自のライブラリ コードで zend ローダーを使用したい場合は、registerNamespace() メソッドを使用してオートローダーに登録できます。ブートストラップでは、次のように実行できます。

protected function _initAutoload()
{

    $autoloader = Zend_Loader_Autoloader::getInstance()->
                           registerNamespace('Buyers_')
    return $autoloader;
}

自動ローダーが機能しない場合は、インクルード パスをどこかのライブラリ フォルダーに設定してください。これは、zend フレームワークによって public/index.php に自動的に追加されます。

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
realpath(APPLICATION_PATH . '/../library'),
get_include_path(),
)));
于 2011-06-23T11:38:42.690 に答える