如何自动加载额外的模块classess像默认命名空间“Application_”?

时间:2011-07-24 12:19:38

标签: zend-framework

默认情况下,默认名称空间Application_下的所有类都是自动加载的。当您创建更多模块时,该模块下的类不会自动加载。

我尝试在application.ini上设置额外模块的命名空间

  

autoloaderNamespaces [] =“EXTRA _”

但由于额外模块的文件夹结构位于Application内,因此无法找到它。

如何正确设置?

3 个答案:

答案 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