从自定义位置手动加载ZF2模块

时间:2014-07-03 15:07:49

标签: php zend-framework2 zend-framework-modules

我想知道是否有任何方法可以手动加载模块。这意味着,比方说我有一个名为Application的模块和另一个名为Clients的模块。我不希望Clients模块进入application.config.php文件,并且无论应用程序首选项如何,都会自动加载。我应该从名为Application的第一个模块中手动加载它。它也可以来自“module”目录以外的任何自定义位置。

欢迎任何体面的答案。谢谢极客们。

2 个答案:

答案 0 :(得分:1)

不,Zend Framework 2不允许您从其他模块加载模块。具体而言,这不是为了防止不希望的副作用。您必须指定两件事:

  1. 模块的加载路径;加载模块时的位置
  2. 您要加载的模块;您登记的模块已启用
  3. 您不能拥有一个未在应用程序配置中列出但无论如何都要加载的模块。

答案 1 :(得分:0)

这是一种解决方案,可以达到预期的要求。我在这里发布,以便任何人发现这个问题可以从中获益。

这个概念实际上是将经过验证的模块与自定义类处理的主要配置一起传递。因此它将由zend的本机模块管理器自动加载。

1.首先将模块的新路径添加到主配置文件中。

<?php return array( // other options 'module_listener_options' => array( 'module_paths' => array( './module', './vendor', './my_module_path', // << HERE WE ADD THE DESIRED MODULE PATH ), // ....... );

2.在我们的主模块中创建一个类函数来检查哪些模块已启用并获取列表

<?php namespace Application; class MyModuleManager { public static function AddCustomModules(array $modules) { // find and create the available module array $custom_modules; return array_merge ($modules, $custom_modules); } }

3.位于index.php目录的public文件,以使用新加载的模块列表注入修改后的配置。

//
// Setup autoloading
require 'init_autoloader.php';

// Run the application!
Zend\Mvc\Application::init(_my_get_configs(require 'config/application.config.php'))->run();

// Custom function to process custom modules
function _my_get_configs(array $config) {
    if (class_exists ('Application\MyModuleManager')) {
        $module_merged = \Application\MyModuleManager::AddCustomModules($confi['modules']);
        $config['modules'] = $module_merged;
    }
    return $config;
}

以上只是我实施和工作的概念的抽象。我不能发布完整的代码,所以只从上面得到概念。如果任何人可以改进上述架构,请建议。