【问题标题】:How do I get Zend Framework to use 'module specific' configurations?如何让 Zend Framework 使用“模块特定”配置?
【发布时间】:2010-12-02 19:05:20
【问题描述】:

在此处阅读文档中的 Zend_Application_Resource_Modules 部分: http://framework.zend.com/manual/1.10/en/zend.application.available-resources.html

我注意到了这一点:

您可以使用模块名称作为配置文件中的前缀或子部分来指定特定于模块的配置。

使用这个:

  [production]
  news.resources.db.adapter = "pdo_mysql"
  news.resources.db.params.host = "localhost"
  news.resources.db.params.username = "webuser"
  news.resources.db.params.password = "XXXXXXX"
  news.resources.db.params.dbname = "news"

对我来说这是个好主意。但是,当我简单地将这些前缀添加到我想要特定于我的模块的某些内容时,没有任何变化。

所以我的问题是:我如何告诉 Zend Framework 实际使用这些模块特定的前缀?

【问题讨论】:

  • 刚开始,我不建议使用特定于模块的配置,因为这听起来会让下一个来维护的人非常感到困惑应用程序。我还是投了赞成票,因为我可能错了。
  • 嘿达里尔,我找到了这篇文章,它可能对amazium.com/blog/zend-framework-module-specific-config有帮助

标签: php zend-framework module


【解决方案1】:

我在 Zend 中使用以下模块实现。它允许您使用“特定于模块”的配置。

application/config/config.ini
-----------------------------
[production]
resources.modules[] =

通过这样做,你告诉 Zend_Application 你想使用 Modules Bootstrap Resource 插件。 Modules 插件将为您的每个模块加载一个单独的引导程序类,不包括默认模块。因此,您需要为您的第二个模块创建一个新的引导类。

application/modules/news/Bootstrap.php
-----------------------------
class News_Bootstrap extends Zend_Application_Module_Bootstrap {

   //---------------------------------------
   // Automatically load our resources
   //
   // NOTE: You don't have to add this, its
   //       just and example to show that you
   //       can customize the bootstrap
   //       process just for this module.
   public function _initModuleResourceAutoloader(){

      $this->getResourceLoader()->addResourceTypes(array(
         'modelResource' => array(
            'path' => 'models/resources',
            'namespace' => 'Resource'
         )
      ));
   }
}

这个“News_Bootstrap”类现在将在引导过程中加载和执行。

此文件的命名约定很重要,因为模块资源插件需要能够找到该类。请注意,您必须将文件命名为 Bootstrap.php。

最后,您会注意到您是 Zend_Application_Module_Bootstrap 的子类,而不是 Zend_Application_Bootstrap_Bootstrap 的子类,就像您在主引导程序中所做的那样。

现在,您的模块特定配置应该可以工作了:

[production]
news.resources.db.adapter = "pdo_mysql"
news.resources.db.params.host = "localhost"
news.resources.db.params.username = "webuser"
news.resources.db.params.password = "XXXXXXX"
news.resources.db.params.dbname = "news"

【讨论】:

  • 感谢您的回答。这是我在找到文档中提到的模块特定前缀之前尝试做的第一件事。上述(正常方式)将为存在的每个模块执行所有引导程序中的所有 _init*() 方法,而不管活动模块如何。我不想要这个。
  • Darryl,也许你可以检测出哪个模块处于活动状态,并设置一个标志。然后让其他引导程序中的所有 _init*() 方法检查标志以确定代码执行是否应该继续。最佳
  • 要记住的一点:我通常在我的模块中重复使用模型和资源。例如,我可能有一个“新闻”模块,它允许我的公关和营销团队通过 CMS 添加/编辑文章。假设我想在我们的主页上显示这些文章,我会在默认模块中重用来自新闻模块的模型或资源。为此,我需要引导进程来执行所有 _init*() 方法。最佳
  • 我发现您的解决方案就是我的问题的答案。这不是我想要的行为。 Zend 框架文档的另一个-1(我真的希望它已针对 2.0 进行了修复)。基于前缀模块的配置选项确实仅在模块引导程序中可用。我将不得不研究检测活动模块并仅引导该部分的其他解决方案。谢谢!
  • 对于特定于模块的配置,您可以在模块目录的 configs 文件夹中使用名为 module.ini 的单独文件。假设您可以将 module.ini 文件放入:application/modules/my_module/configs
猜你喜欢
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多