【发布时间】: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_Article、Bar_Model_Mapper_Article、Bar_Model_DbTable_Article、Bar_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