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

时间:2011-04-09 07:59:27

标签: 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

例如,在 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;
    }
}

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

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

修改(关于此问题的最常见问题):

  • 默认的Zend命名约定用于类。例如Bar_Model_ArticleBar_Model_Mapper_ArticleBar_Model_DbTable_ArticleBar_Form_Publish,...(并且被放置在各自的文件夹中。)

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

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

修复

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

bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"

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

2 个答案:

答案 0 :(得分:5)

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

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

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

resources.modules[] = ""

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

答案 1 :(得分:0)

我也总是这样。但是自1.10发布以来(狂野猜测),您可以删除该引导代码,并将以下行放在您的application.ini中:

appnamespace = "Foo"

我个人让我的空虚。