Zend Framework - 扩展模块控制器

时间:2010-05-27 16:11:53

标签: zend-framework module zend-controller zend-autoloader

我有以下目录结构:

modules/
  api/
    controllers/
      ApiController.php
      InventoryController.php
      OtherController.php

init()方法在多个控制器中很常见,所以我想将它重构为父控制器类,例如:

class Api_ApiController extends Zend_Controller_Action
{
    public function init()
    {
        // common code
    }
}

当我尝试:

class Api_InventoryController extends Api_ApiController

我明白了:

  

致命错误:类'Api_ApiController'   找不到   /application/modules/api/controllers/InventoryController.php   第4行

为什么Zend Framework没有将Api_ApiController映射到modules / api / controllers / ApiController.php?

通过将ApiController放在库中并注册命名空间,我已经找到了解决这个问题的方法,但这对我来说似乎是个黑客攻击。

2 个答案:

答案 0 :(得分:7)

“问题”是,ZF没有在自动装带器中注册控制器目录,因为控制器通常是通过Zend_Controller_Dispatcher加载的。另一方面,在引导程序中实例化的Zend_Application_Module_Autoloader仅注册

        'dbtable' => array(
            'namespace' => 'Model_DbTable',
            'path'      => 'models/DbTable',
        ),
        'mappers' => array(
            'namespace' => 'Model_Mapper',
            'path'      => 'models/mappers',
        ),
        'form'    => array(
            'namespace' => 'Form',
            'path'      => 'forms',
        ),
        'model'   => array(
            'namespace' => 'Model',
            'path'      => 'models',
        ),
        'plugin'  => array(
            'namespace' => 'Plugin',
            'path'      => 'plugins',
        ),
        'service' => array(
            'namespace' => 'Service',
            'path'      => 'services',
        ),
        'viewhelper' => array(
            'namespace' => 'View_Helper',
            'path'      => 'views/helpers',
        ),
        'viewfilter' => array(
            'namespace' => 'View_Filter',
            'path'      => 'views/filters',
        )

因此,要么将基本控制器脚本包含在require_once中,要么修改自动加载器以包含控制器目录。

答案 1 :(得分:0)

[重编辑。请忽略我以前的答案;我误解了这个问题。我粗心。]

您是否在Bootstrap中实例化了自动加载器?类似的东西:

protected function _initAutoloader()
{
    $autoloader = new Zend_Application_Module_Autoloader(array(
        'namespace' => '',
        'basePath'  => APPLICATION_PATH . '/modules',
    ));
    return $autoloader;
}