如何为每个模块自动加载每个表单和模型?请考虑以下文件结构:
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_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"
同意,全局引导程序将不再起作用;但它比模块引导不起作用要好得多。如果有人知道如何仍然拥有全局引导程序,请随时发表评论。希望这对有类似问题的其他人有所帮助。
答案 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"
我个人让我的空虚。