在Zend框架中开发/使用自定义资源插件


Developing/using a custom Resource Plugin in Zend Framework

我们使用了Zend_Log,它在application.ini中针对不同的环境进行了不同的配置。我们在bootstrap中初始化/获取它,并将它存储在注册表中:

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

但是我们已经子类化了Zend_Log(比如,Our_Log)来添加自定义的特性,并希望以同样的方式获得它。然后我们需要创建一个新的资源插件。这看起来很简单——只需复制Application/Resource/Log.php,将文件重命名为Ourlog.php,将类重命名为Zend_Application_Resource_Ourlog类。现在,让我们不要担心"Our_Log"类——只需使用新的资源插件来获取Zend_Log,以减少变量。

那么,我们在bootstrap中的新代码是:
$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"路径。我错了吗?还有其他想法吗?我将很高兴地写下最终对我有效的方法,以帮助其他处于这种情况下的可怜人。也许和名称空间有关?

插件类使用插件加载器解析,其工作原理与自动加载器略有不同;所以仅仅要求这门课是没有用的。相反,将它添加到application.ini:

pluginPaths.Application_Resource = "Application/Resource"

,那么您应该能够正常使用该类。由于上面的路径将在默认的Zend路径之前被检查,因此您还可以将您的类命名为'Log',并扩展Logger资源以覆盖标准功能。