2011-09-30 54 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