我想写一些动作助手,但似乎我做得不好。
首先,在我的引导程序中,我正在执行以下操作:
Zend_Controller_Action_HelperBroker::addPath(APPLICATION_PATH.'/controllers/helpers/My/Helper/', 'My_Helper');
在这个目录中,我有以下树:
My/Helper/
- Fileupload/
- Abstract.php
- Xhr.php
- Fileupload.php
在我的控制器中,我成功调用了文件上传帮助程序(在类 My_Helper_Fileupload 中):
$res = $this->_helper->fileupload($directory);
但是在这个帮助器的构造函数中,我正在尝试获取另一个帮助器(在类 My_Helper_Fileupload_Xhr 中):
Zend_Controller_Action_HelperBroker::getStaticHelper('Fileupload_Xhr');
这导致我错误
按名称排列的操作帮助程序 找不到文件上传Xhr
我做错了什么?我尝试了很多东西,但我无法弄清楚出了什么问题......
此外,经过一些测试,似乎在我的文件上传帮助程序的构造函数中,当我调用 getActionController 方法时,我得到了 NULL。它不应该自动设置吗?
帮助程序代理将删除下划线,作为其"规范化"您为其提供的帮助程序名称的过程的一部分。它只处理驼峰助手名称,因此您的Fileupload_Xhr
将转换为FileuploadXhr
。
最终负责查找和加载正确 PHP 文件的Zend_Loader使用下划线来确定何时应添加目录分隔符。
如果将这两件事结合起来,实际结果是操作帮助程序代理的任何路径下都不能有嵌套文件夹结构。您希望能够为添加的任何路径加载的所有帮助程序类addPath
必须直接驻留在给定路径下,没有干预子文件夹。
简单的解决方案是将您的助手从 My/Helper/Fileupload/Xhr.php
移动到 My/Helper/FileuploadXhr.php
.
假设您使用My
作为您的应用程序命名空间 - 这是我通常所做的; Application
太长而无法输入 - 那么这是一种方法。
在引导中:
Zend_Controller_Action_HelperBroker::addPath(APPLICATION_PATH .'/controllers/helpers', 'My_Controller_Helper');
将帮助程序类命名为 My_Controller_Helper_SomeHelper
并将其存储在文件application/controllers/helpers/SomeHelper.php
中。
使用以下命令在控制器中调用:
$this->_helper->someHelper()
如果您的 appnamespace 不同,只需将 My_
替换为您的 appnamespace。