2012-06-07 327 views
1

require_once是否正確? 哪裏,你會如何把它包括路徑?ZF包含路徑

它不應該在application.ini或bootstrap中嗎?

例:

require_once 'Zend/View/Helper/Abstract.php'; 
// @question - is this correct - where and 
// how would you put it include path 

class Zend_View_Helper_Translate extends Zend_View_Helper_Abstract 
{ 
} 
+0

我的問題給你...是否有助於你真正需要的解決方案?也許一個插件會更合適? – RockyFord

回答

3

一般而言,您可以通過適當使用Zend_Loader_Autoloader幾乎完全避免撥打require_once。當然,關鍵是「適當的」。

通常,您的public/index.phpinclude_path設置爲library文件夾。然後,如果您使用的是Zend_Application,則Zend_Loader_Autoloader已註冊以查找其名稱空間前綴已使用application/configs/application.ini中的autoloadernamespaces數組註冊的任何PSR-0 compliant classes

棘手的部分是在不「駐留在包含路徑」文件中定義的類,就像出現在application/models模型,駐留在application/services服務等即使類中定義有傾向於遵循PSR- 0標準,PSR-0映射相對於基地off包含路徑的事實意味着系統必須知道類名前綴與基本路徑之間的映射。這是resource autoloaders進來的地方。這些資源自動加載器通常在應用程序Bootstrap中自動設置,擴展Zend_Application_Bootstrap_Bootstrap和模塊引導程序,擴展Zend_Application_Module_Bootstrap

視圖助手是類「駐留在include_path」之外的另一個例子,可能類似於application/views/helpers。由於通常使用簡寫形式$this->someHelper($someParam)在視圖腳本中調用這些腳本,因此必須告知系統如何從此簡稱生成完全限定的類名。這是通過使用將名稱空間前綴映射到文件系統位置的$view->addPrefixPath()完成的。同樣,應用程序級別和模塊級別的自舉機制也爲您設置了大部分。

對於不遵循PSR-0標準的庫/類,您可以創建custom autoloaders並將它們(通常在Bootstrap處)附加到Zend_Loader_Autoloader單例。這是你明確包含/需要的唯一地方。

tl; dr:通過正確使用現有的ZF自動加載機制,您幾乎不需要在自己的應用程序代碼中包含include/require語句。

+1

@想要解決這個很好的答案,丟掉include語句並將幫助器放在目錄'application/views/helpers'或'modules/module/views/helpers'中,它就可以工作。在你的視圖中用'$ this-> Translate($ someParam)'調用助手'...好運 – RockyFord

+0

這是最全面和最簡潔的答案。沒想到這麼多謝謝!我正在掌握它,但很難找到信息這個好。 – Wil

+0

我的榮幸,很高興它有所幫助。感謝RockyFord爲我的典型的過度擴張漫遊做了底線。 ;-) –

-1

這不是在這種情況下是正確的。

首先,請使用Zend Tool。它會創建你不知道如何創建自己的文件。它會創建正確的類名,並將它們適當地擴展並且可能需要的任何東西。

請勿將require_once放置在引導程序中。您只希望它在需要時執行,而不是每個請求。

至於您所提供的例子中,正確的版本是:

require_once "Zend/View/Interface.php"; 
class Zend_View_Helper_Foo extends Zend_View_Helper_Abstract { 
} 

由助手擴展的類被自動加載,並把它在require_once什麼都不做。

+0

對於downvoter:任何評論爲什麼你認爲我的答案沒有用? – mingos

+0

感謝上面的答案。終於到了那裏。 – Wil

+0

我已經閱讀過它,但仍然沒有理由讓我失望。 – mingos