我想知道是否有办法从zend框架2中的数据库表中加载模块?我希望能够根据数据库表中的状态列动态禁用或启用模块
答案 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在Module.php中添加模块侦听器
public function init(ModuleManagerInterface $manager)
{
$sharedEventManger = $manager->getEventManager()->getSharedManager();
$sharedEventManger->attach(ModuleManager::class, ModuleEvent::EVENT_LOAD_MODULES_POST, new ModuleListener(), 10000);
}
由我创建的模块侦听器类似于:
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);
}
希望它有用。