【问题标题】:Autoloading forms and models for each module in Zend?Zend 中每个模块的自动加载表单和模型?
【发布时间】:2011-04-09 07:59:27
【问题描述】:

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

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 你有以下(non-functional)代码:

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"

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

【问题讨论】:

  • 你需要这个做什么?您可以使用 RecursiveDirectoryIterator (php.net/manual/en/class.recursivedirectoryiterator.php) 递归遍历所有模块目录并加载所有文件。
  • @Zyava 我宁愿以正确的方式做事,而不是简单的方法。 Zend 优化了类加载,这对站点和开发人员来说总是一个加分项。无论如何感谢您的链接,我会看看它。

标签: php zend-framework zend-form


【解决方案1】:

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

编辑:听起来您的模块引导程序没有运行。这不是一个不常见的问题,因为它们组合在一起的方式可能有点令人困惑。验证这一点的最快方法是向其中一个添加一个 init 方法,其中包含一个 echo 和一个 exit,并查看它是否有输出。

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

resources.modules[] = ""

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

【讨论】:

  • 我遵循正确的结构,但它不起作用。使用@Tjorriemorrie 的答案提供的设置时,它仅适用于应用程序/模型*(因此不适用于模块)。
  • 您一定是做错了其他事情,因为这实际上是实现这一目标的正确方法。
  • 你能举一个你的类名的例子吗?例如。上面示例中的帐户模型应命名为 Foo_Model_Account - 这与您所拥有的匹配吗?
  • @John Cartwright 这就是我的想法,但就目前而言,一切都符合命名约定。尝试了所有答案/ cmets。然而无济于事。 @Tim Fountain 是的,这完全匹配(我首先仔细检查的是约定)。我将编辑我的问题以反映 cmets。
  • 保持主引导程序不应该有任何问题。我使用您的结构创建了一个准系统应用程序,其中包括工作模块自动加载和主引导程序。你可以在这里tim.incutio.com/moduleautoloadtest.zip 获取它(只需将 ZF 放入库文件夹即可使其工作)。希望这会给你一些线索。
【解决方案2】:

我也一直这样。但是自从 1.10 发布后(猜测),您可以删除该引导代码并将以下行放入您的 application.ini 中:

appnamespace = "Foo"

我个人是空着的。

【讨论】:

  • 这使它适用于我的全局应用程序/模型*,但它不会加载任何特定于模块的模型。
  • @lefke123 好的,添加resources.frontController.moduleDirectory = APPLICATION "/modules"resources.module[] = ""
  • 我已经有了这些台词,这就是为什么这个问题如此顽固的原因。还是谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
  • 2014-08-28
  • 1970-01-01
相关资源
最近更新 更多