代码之家  ›  专栏  ›  技术社区  ›  Matt McCormick

Zend框架-扩展模块控制器

  •  4
  • Matt McCormick  · 技术社区  · 15 年前

    我有以下目录结构:

    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” 找不到 /应用程序/模块/api/controllers/inventorycontroller.php 在线4

    为什么Zend框架不将api-apicontroller映射到modules/api/controllers/apicontroller.php?

    我已经找到了一种方法来解决这个问题,将apicontroller放入库/并注册名称空间,但对我来说这似乎是一个黑客。

    2 回复  |  直到 15 年前
        1
  •  7
  •   Stefan Gehrig    15 年前

    “问题”是,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 或者修改自动加载程序,使其也包含控制器目录。

        2
  •  0
  •   David Weinraub    15 年前

    [大量编辑。请忽略我以前的回答;我误解了这个问题。我的疏忽。]

    您在引导程序中实例化了自动加载程序吗?类似:

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