2011-06-23 7 views
3

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

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

MyProjectと

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

を_scripts私は私の寄付クラス「バアイの名前Zendフレームワークの命名規則として「rs_Donations」を使用します。私は私のコントローラ

$obj= new Buyers_Donation(); 

の内側にこのクラスを使用してみました場合は

は、それはエラーがコントローラ内部クラスBuyers_Donationを見つけることができません与えました。

しかし、私は私のブートストラップに以下の行を追加したときにそれが働いた:私は私の中の任意のモジュールを持っていないが、

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

誰かが実際に何が起こったのか説明してくださいとモジュールオートローダーの使用は何でした応用 ?

+0

index.phpに_Zendインクルードパスを設定しましたか? (set_include_path(path to zend)) – Sahal

+1

@ Saahal:はい私はしました – Songo

+0

それでもうまくいきませんでしたか? – Sahal

答えて

5

モジュールを使用していないので、モジュールオートローダーを使用しないでください。 Zend *クラスが正しく自動ロードされていると仮定すると、標準オートローダには、 'バイヤー'名前空間のクラスにも使用する必要があります。したがって、投稿したコードスニペットの代わりに、次のようにしてください:

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

また、希望する場合はapplication.iniでこれを設定することもできます。

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

+0

あなたの返信をありがとう。 「setFallbackAutoloader(true);」という関数を正確に実行してくださいそれを "registerNamespace( 'Buyers_');と比較して比較してください?ライブラリへのパスがインクルードパス上にあるにも関わらず、クラスがロードされないのはなぜですか? – Songo

+1

registerNamespace( 'Buyers_')は、Autoloaderを 'Buyers_'で始まるクラスに使用する必要があることをZFに通知します。 setFallbackAutoloader(true)は、他のオートローダーと一致しないクラスに対してオートローダーを使用する必要があることをZFに通知します。 –

+0

hmmm私は今それを取得しますが、registerNamespace()の代わりにsetFallbackAutoloader(true)を使うのに問題がありますか?オーバーヘッドかもしれない?最後になぜzendクラスがデフォルトでロードされるのでしょうか?書かれているか言及されていますか? – Songo

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(), 
))); 
+0

返信いただきありがとうございます。ですから、基本的には、オートローダが指定したクラスを含むファイルを「一度必要とする」ということですか? – Songo

関連する問題