我有以下目录结构:
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放在库中并注册命名空间,我已经找到了解决这个问题的方法,但这对我来说似乎是个黑客攻击。
答案 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;
}