2

我想写一些动作助手,但似乎我做得不好。

首先,在我的 Bootstrap 文件中,我正在执行以下操作:

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');

这导致我出错

找不到名称 FileuploadXhr 的操作助手

我究竟做错了什么?我尝试了很多东西,但我无法弄清楚什么是错的......

此外,经过几次测试,似乎在我的文件上传助手的构造函数中,当我调用 getActionController 方法时,我得到了 NULL。不是应该自动设置吗?

4

2 回答 2

2

助手代理将删除下划线作为其“规范化”你给它的助手名称的过程的一部分。它仅处理 CamelCased 助手名称,因此您Fileupload_Xhr将转换为FileuploadXhr.

最终负责查找和加载正确 PHP 文件的 Zend_Loader 使用下划线来确定何时应该添加目录分隔符。

如果将这两件事结合起来,实际的结果是您不能在任何路径下为操作助手代理提供嵌套文件夹结构。您希望能够为添加的任何路径加载的所有帮助程序类addPath必须直接位于给定路径下,没有中间的子文件夹。

简单的解决方案是将您的助手My/Helper/Fileupload/Xhr.phpMy/Helper/FileuploadXhr.php.

于 2012-05-09T00:51:41.510 回答
1

假设你正在使用My你的 appnamespace——这是我通常做的;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。

于 2012-05-09T03:17:34.703 回答