项目中需要自定义Action Helper。虽然可以将Action Helper放置在自定义的类库目录下解决Autoloading问题,但是由于该类只在当前项目中使用到,因此更希望实现如下路径:

application/
  controllers/
    helpers/
      Acl.php
    IndexController.php
  Bootstrap.php

最终在StackOverflow上找到了解决办法,移除不必要的代码,具体实现如下:

类名:Application_Controller_Action_Helper_Acl

只要在Bootstrap.php中添加如下方法即可:

protected function _initActionHelpers()
{
    Zend_Controller_Action_HelperBroker::addPath(
        APPLICATION_PATH . '/controllers/helpers',
        'Application_Controller_Action_Helper_'

    );
}

如果该Action Helper可以在多个项目中使用,那么将其放置在自定义类库目录下的路径是个不错的选择,如下:

library/
  My/
    Controller/
      Action/
        Helper/
          Acl.php

类名如下:My_Controller_Action_Helper_Acl

首先,在application/configs/application.ini中添加如下配置:

autoloaderNamespaces.my = "My_"

或者

autoloaderNamespaces[] = "My_"

然后,在Bootstrap.php中添加如下方法来加载Helper类:

protected function _initActionHelpers()
{
  Zend_Controller_Action_HelperBroker::addHelper(
    new My_Controller_Action_Helper_Acl()
  );
}

以上就是两种不同的实现Action Helper自动加载的方法。起初由于对ZF的Resource Autoloading不熟悉,被StackOverflow上的解决方法迷惑了,最后发现其实实质内容都是一样的。

PS:其实Action Helper的用处我还没有搞清楚,目前只是照葫芦画瓢的说,囧!