Zend中每个模块的自动加载表单和模型?

lev*_*ele 4 php zend-framework zend-form

如何为每个模块自动加载每个表单和模型?请考虑以下文件结构:

application/
    modules/
        foo/
            forms/
                Register.php
            models/
                Account.php
        Bootstrap.php
        bar/
            forms/
                Publish.php
            models/
                Article.php
        Bootstrap.php
    Bootstrap.php
Run Code Online (Sandbox Code Playgroud)

例如,在foo/Bootstrap.php中,您有以下(非功能)代码:

class Foo_Bootstrap extends Zend_Application_Module_Bootstrap
{
    protected function _initAutoLoad()
    {
        $loader = new Zend_Loader_Autoloader_Resource(array(
            'basePath'  => APPLICATION_PATH . '/modules/foo',
            'namespace' => 'Foo',
        ));

        $loader->addResourceType('form', 'forms', 'Form')
            ->addResourceType('model', 'models', 'Model');
        return $loader;
    }
}
Run Code Online (Sandbox Code Playgroud)

基本问题:如何修改引导程序以便它从Foo模块加载每个表单和模型?

额外的问题:是否有可能在每个模块中加载表单和模型的全局自动加载器?如果是这样,怎么样?

编辑(关于该问题的最常见问题):

  • 默认的Zend命名约定用于类.如Bar_Model_Article,Bar_Model_Mapper_Article,Bar_Model_DbTable_Article,Bar_Form_Publish,...(和被放置在各自的文件夹).

  • 它不仅仅是一个没有加载类的模块,而是所有这些模块.

  • 使用带有多个模型,映射器,dbtables和表单的普通无模块应用程序时,使用Zend自动加载器的自动加载类没有问题.

固定

正如@Tim Fountain提到的那样,模块bootstraps没有被运行,这意味着没有任何自动加载发生在Zend中.最后,我发现问题出在我的案例中.我不得不从配置中删除以下行:

bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
Run Code Online (Sandbox Code Playgroud)

同意,全球引导程序将不再起作用; 但它比模块引导不起作用要好得多.如果有人知道如何仍然拥有全局引导程序,请随时发表评论.希望这对有类似问题的其他人有所帮助.

Tim*_*ain 5

模块引导类自动设置模块自动加载器,因此您可以删除示例_initAutoload()函数,只留下一个空类,它应该都可以正常工作.请参阅:http://framework.zend.com/manual/en/zend.loader.autoloader-resource.html#zend.loader.autoloader-resource.module

编辑:听起来你的模块bootstraps没有运行.这并不是一个罕见的问题,因为它们所有这些结合在一起的方式可能会有点令人困惑.验证这个的最快方法是只使用echo和exit为其中一个添加init方法,看看它是否得到输出.

模块引导由Zend应用程序中的"模块"资源引入并运行.您需要以某种方式触发此资源,因为ZF不会去寻找模块引导,以防它们存在.最常见的方法是在application.ini中包含以下行:

resources.modules[] = ""
Run Code Online (Sandbox Code Playgroud)

或者,您可以从主Bootstrap文件手动设置资源.