2011-04-09 51 views
4

某人如何自动加载每个模块的每个表单和模型?请看下面的文件结构:自动加载Zend中每个模块的表单和模型?

application/ 
    modules/ 
     foo/ 
      forms/ 
       Register.php 
      models/ 
       Account.php 
     Bootstrap.php 
     bar/ 
      forms/ 
       Publish.php 
      models/ 
       Article.php 
     Bootstrap.php 
    Bootstrap.php 

而且例如,在富/ 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和表单的普通no-module应用程序时,使用Zend自动加载器自动加载类没有问题。

修复

由于@Tim喷泉提到的模块白手起家都没有运行,这意味着没有自动加载的发生的真实烤到Zend。最终,我发现问题出在我的情况下。我不得不从我的配置中删除以下行:

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

同意,全局bootstrap不再工作了;但比模块引导程序无法正常运行要好得多。如果有人知道如何拥有全球引导,请随时发表评论。希望这可以帮助其他类似问题的人。

+0

你需要什么?您可以使用RecursiveDirectoryIterator(http://php.net/manual/en/class.recursivedireiteiteite.php)递归地遍历所有模块目录并加载所有文件。 – Zyava 2011-04-09 10:37:17

+0

@Zyava我宁愿采用正确的方式,而不是简单的方式。 Zend优化了类加载,这对于网站和开发人员来说总是一个优点。无论如何,感谢您的链接,我会看看它。 – levivanzele 2011-04-09 12:26:42

回答

5

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

编辑:这听起来像你的模块bootstraps没有运行。这并不是一个不常见的问题,因为它们的组合方式可能有点混乱。验证这种方法的最快方法是只用一个回显和一个退出来为其中一个init方法添加一个init方法,看它是否有输出。

模块引导程序由Zend Application内的'模块'资源引入并运行。你需要以某种方式触发这个资源,因为ZF不会为模块bootstraps而去寻找,以防他们在那里。执行此操作的最常见方法是将此行包含在您的应用程序中。INI:

resources.modules[] = "" 

您也可以手动设置从你的主引导程序文件中的资源。

+0

我遵循正确的结构,但它不起作用。只有在使用@ Tjorriemorrie的答案提供的设置时,它才适用于应用程序/模型*(因此不适用于模块)。 – levivanzele 2011-04-10 08:07:42

+0

您必须正确地做其他事情,因为这实际上是实现此目的的正确方法。 – 2011-04-10 19:44:38

+0

你能举一个你的班级名称的例子吗?例如。你上面例子中的账户模型应该被命名为Foo_Model_Account - 这是否符合你的要求? – 2011-04-11 00:37:48

0

我也总是这样。但由于1.10(胡乱猜测)的发布,你可以删除引导代码,只是把下面一行在你的application.ini:

appnamespace = "Foo" 

我个人离开矿井空。

+0

这使它适用于全球应用程序/模型*,但它不加载任何模块特定的模型。 – levivanzele 2011-04-10 08:12:00

+0

@ lefke123好吧,加 'resources.frontController.moduleDirectory = APPLICATION“/ modules”''和'resources.module [] =“”' – Tjorriemorrie 2011-04-11 10:51:34

+0

我已经有了这些行,这就是为什么它很奇怪这个问题如此持久。不管怎么说,还是要谢谢你! – levivanzele 2011-04-11 17:47:45