ZF2 / 3从数据库加载模块

时间:2017-06-14 16:00:51

标签: zend-framework2 zend-framework3

我想知道是否有办法从zend框架2中的数据库表中加载模块?我希望能够根据数据库表中的状态列动态禁用或启用模块

3 个答案:

答案 0 :(得分:0)

我非常确定您可以通过将侦听器附加到某些<img src="yourPath/yourImage.png" alt="..." /> 事件来实现此目的。 有v3 https://docs.zendframework.com/zend-modulemanager/module-manager/和v2 https://framework.zend.com/manual/2.1/en/modules/zend.module-manager.module-manager.html

的文档

并且不要忘记自动加载v3

答案 1 :(得分:0)

通过阅读你的问题tom_cruz,我意识到我有完全相同的问题; - )

我浏览了ModuleManager,ModuleManagerFactory,ModuleEvent和一些监听器的ZF2源代码。在分析了流程之后,我的新问题是:

&#34;我对主动/非主动模块有什么期望?&#34;

所提到的事件Nemutaisama几乎完成了所有重要的事情 。即通过将getConfig()方法添加到Module.php类来加载配置。

ATM我无法回答上述问题。我会回到这一个地方。但是现在,我认为它是一个应用程序问题,而不是框架问题。

答案 2 :(得分:0)

我前段时间做过这个:

  1. 创建一个负责从数据库中获取模块的“核心”模块 1.1在Module.php中添加模块侦听器

    public function init(ModuleManagerInterface $manager)
    {
      $sharedEventManger = $manager->getEventManager()->getSharedManager();
      $sharedEventManger->attach(ModuleManager::class, ModuleEvent::EVENT_LOAD_MODULES_POST, new ModuleListener(), 10000); 
    }
    
  2. 由我创建的模块侦听器类似于:

      public function __invoke(ModuleEvent $event)
      {
       $target = $event->getTarget(); 
       $serverName = $_SERVER['SERVER_NAME'];
    
       if(! $serverName) { return; }
    
       //module ok 
       if(! $target instanceof ModuleManagerInterface) { return; }
    
       //config data
       $configListener = $event->getConfigListener(); 
       $config = $configListener->getMergedConfig(false); 
    
       //app modules
       $modules  = $target->getModules(); 
    
       //select active modules
       $adapter = new Adapter($config['db']); 
       $sql = new Sql($adapter); 
       $select = $sql->select(['c' => 'customers'])
                  ->join(['cm' => 'customers_modules'], 'cm.customer_id = c.id', ['module' => 'module'])
                  ->where(['c.domain' => $serverName])
                  ->where(['cm.active' => 1]); 
    
       $statement = $sql->prepareStatementForSqlObject($select);
       $result    = $statement->execute();
    
       if($result instanceof ResultInterface && $result->isQueryResult() && $result->getAffectedRows()) {
    
        //change db connection params here (if you use different db for customers)
    
        while ($current = $result->current()) {
    
            if (! in_array($current['module'], $modules)) {
                try {
                    $target->loadModule($current['module']) ;
                } catch (\RuntimeException $e) { 
                    $target->loadModule('WQ' . str_replace($current['prefix'], '', $current['module']));
                }
                $modules[] = $current['module'];
    
                $module = $target->getModule($current['module']);
    
                if (($module instanceof ConfigProviderInterface) || (is_callable([$module, 'getConfig']))) {
                    $moduleConfig = $module->getConfig();
    
                    $config = ArrayUtils::merge($config, $moduleConfig);
                }
            }
    
            $result->next(); 
        }
    }
    
    $target->setModules($modules);
    $configListener->setMergedConfig($config);
    
    }
    
  3. 希望它有用。