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)
同意,全球引导程序将不再起作用; 但它比模块引导不起作用要好得多.如果有人知道如何仍然拥有全局引导程序,请随时发表评论.希望这对有类似问题的其他人有所帮助.
模块引导类自动设置模块自动加载器,因此您可以删除示例_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文件手动设置资源.