2011-06-23 73 views
3

我使用Zend框架開發項目,並遇到以下問題。我使用Zend框架MVC文件夾結構生成使用他們的zf.sh腳本。Zend框架中的模塊自動加載器

我的庫文件夾有Zend庫文件夾,它的類可以在應用程序內部正常調用。我在我的類庫中創建了另一個文件夾。這是現在的文件夾結構:

MyProject的

| _Application
| _docs
| _Public
| _LIBRARY
                    | _Zend
                    | _Buyers
                                        | _Donations.php
| _scripts

我叫我的捐贈類「布夜rs_Donations「作爲Zend框架命名約定。

當我試圖用我的控制器

$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(路徑到zend)) – Sahal

+1

@Sahal:是的,我做過 – Songo

+0

它仍然沒有奏效? – Sahal

回答

5

正如您所猜測的,您不應該使用模塊自動加載器,因爲您沒有使用模塊。假設Zend *類爲您自動加載,您只需告知標準自動加載器,它也應該用於「買方」名稱空間中的類。所以,而不是你張貼的代碼片段,只是做:

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

如果你願意,你也可以在application.ini中設置。

我還假設你的類是在庫文件夾中,而不是在公共目錄中,因爲你的問題意味着(這將是糟糕的)。

+0

感謝您的回覆。你能解釋一下函數「setFallbackAutoloader(true);」做和比較它「registerNamespace('Buyers_');」 ?另一個問題是爲什麼不加載這些類,雖然傳遞給庫的路徑在包含路徑上? – Songo

+1

registerNamespace('Buyers_')告訴ZF該自動加載器應該用於任何以'Buyers_'開頭的類。 setFallbackAutoloader(true)告訴ZF該自動加載器應該用於任何不與其他自動加載器匹配的類。 –

+0

嗯我現在得到它,但會有一個問題,使用setFallbackAutoloader(true),而不是registerNamespace()?開銷可能?最後一件事是爲什麼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