默认情况下,默认名称空间Application_
下的所有类都是自动加载的。当您创建更多模块时,该模块下的类不会自动加载。
我尝试在application.ini
上设置额外模块的命名空间
autoloaderNamespaces [] =“EXTRA _”
但由于额外模块的文件夹结构位于Application
内,因此无法找到它。
如何正确设置?
答案 0 :(得分:2)
您可以使用application resource modules
模块引导程序(如果Zend_Application_Module_Bootstrap的子类)在实例化时注册自动加载器。
以下是默认情况下使用自动加载器注册的资源数组:
array(
'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',
),
)
您可以从模块引导程序将自己的模块资源类型添加到自动加载器:
//module bootstrap for module foo
class Foo_Bootstrap extends Zend_Application_Module_Bootstrap
{
function _initMyRes()
{
$autoloader = $this->getResourceLoader();
$autoloader->addResourceType('myres', 'myres/custom/path', 'My_Res');
}
}
第一个参数是资源类型的键,第二个是相对于模块名称的路径,第三个是资源前缀。
例如,类Foo_My_Res_Bar
将从modules/foo/myres/custom/path/Bar.php
答案 1 :(得分:1)
命名空间适用于您自己的库类(如Zend_)类。模块是不同的东西,在这个意义上没有命名空间。
在application.ini配置中,您将拥有类似这样的内容
autoloaderNamespaces.My = "My_"
// these are you library classes
resources.frontController.moduleDirectory = APPLICATION_LIBRARY "/modules"
// this is your module directory
更新如果您需要支持多个模块目录,则需要ZF 1.11.1或此bugfix
答案 2 :(得分:0)
在每个模块的Bootstrap
课程中,创建一个新的module resource autloloader:
protected function _initResourceAutoloader()
{
$resourceAutoloader = new Zend_Application_Module_Autoloader(array(
'namespace' => 'Mymodule',
'basePath' => dirname(__FILE__),
));
}
然后,您可以将“标准”文件夹结构用于特定于模块的类。例如,名为Mymodule_Form_Edit
的表单将驻留在文件modules/mymodule/forms/Edit.php
<强>更新强>
如@Xerkus和others所述,扩展Zend_Application_Module_Bootstrap
的模块Bootstrap将自动注册一些标准命名空间/路径映射,因此无需手动实例化Zend_Application_Module_Autoloader
。