2011-09-30 57 views
1

我們已經使用了Zend_Log,它在application.ini中針對不同的情況進行了不同的配置。我們初始化它/讓它在引導並存儲在註冊表中:在Zend Framework中開發/使用自定義資源插件

$r = $this->getPluginResource('log'); 
$logger = $r->getLog(); 

但是我們的子類Zend_Log進行(比如,Our_Log)添加自定義的功能,並希望得到同樣的方式。那麼我們必須製作一個新的資源插件。這似乎很容易 - 只需複製Application/Resource/Log.php,將文件重命名爲Ourlog.php,將該類重命名爲類Zend_Application_Resource_Ourlog。現在,我們不用擔心「Our_Log」這個類 - 只需使用新的Resource Plugin來獲取Zend_Log,以減少變量。

那麼,我們在引導新的代碼是:

$r = $this->getPluginResource('ourlog'); 
$logger = $r->getLog(); 

,但當然,這並不工作,錯誤的方法應用到非對象「R」。根據文檔,

「只要您爲此資源插件註冊前綴路徑,即可在您的應用程序中使用它。」

但是您如何註冊前綴路徑?這會有所幫助。但是這並不重要,我使用與默認相同的前綴路徑,並且我知道該文件正在被讀取,因爲我「需要」它。

無論如何,任何指導什麼簡單的步驟我失蹤將不勝感激。


感謝指針 - 如此接近,如此接近(我認爲)。我想我得到它...

好了,所以我改名爲類Xyz_Resource_Xyzlog,我把它放在library/Xyz/Resource/Xyzlog.php

然後,因爲我不愛INI文件中,我把引導:

$loader=$this->getPluginLoader(); 
$loader->addPrefixPath('Xyz_Resource','Xyz/Resource/'); 
$r = $this->getPluginResource('xyzlog'); 
if (!is_object($r)) die ('Not an object!!'); 

猝死。那麼,好吧,做ini:

pluginPaths.Xyz_Resource='Xyz/Resource/' 

相同。沒有幫助。我相信插件路徑的基本路徑將包含PHP「include」路徑。我誤解了嗎?任何其他想法?我會高興地寫下最終在這種情況下爲我幫助其他可憐的靈魂的東西。可能與名稱空間有關?

回答

4

插件類使用插件加載器解析,該加載器與自動加載器的工作方式稍有不同;所以只要求班級在這裏幫不了你。相反,將此添加到您的application.ini中:

pluginPaths.Application_Resource = "Application/Resource" 

然後,您應該可以正常使用該類。由於上面的路徑將在默認的Zend之前檢查,您還可以命名您的類爲「日誌」,並仍然擴展Logger資源以覆蓋標準功能。

+1

+1。也只是對問題作者的一個提示,你不應該命名你的資源Zend_ *,因爲它是爲實際上是框架一部分的類保留的。從[命名約定](http://framework.zend.com/manual/en/coding-standard.naming-conventions。html)頁面:注意:*重要*:必須與Zend Framework庫一起部署的代碼,但不是標準或額外庫的一部分(例如未由Zend分發的應用程序代碼或庫)絕不能以「Zend_」開頭或「ZendX_」。 – drew010