gpt4 book ai didi

events - 如何在模块的 init 方法(ZF2)内获取对服务管理器的引用?

转载 作者:行者123 更新时间:2023-12-02 21:45:46 24 4
gpt4 key购买 nike

我需要在任何 MvcEvent::EVENT_BOOTSTRAP 监听器执行之前执行一些代码。显然 Module::onBootstrap 不是一个选项。我以以下代码结束:

class Module
{

function init(\Zend\ModuleManager\ModuleManager $moduleManager)
{
$moduleManager->getEventManager()->attach(
MvcEvent::EVENT_BOOTSTRAP, array(ClassX, 'StaticMethodOfClassX'), 20000);
}

}

我不想对 array(ClassX, 'StaticMethodOfClassX') 引用进行硬编码,而是从服务管理器获取它。我的问题是我不知道如何在模块的 init 方法中获取服务管理器引用。有什么帮助吗?或者说这在ZF2现在是不可能的?无论这种模式或意见有什么变体,我们都将不胜感激;)

编辑:

我将澄清“显然 Module::onBootstrap 不是一个选项”,因为可能不是那么微不足道;)

模块的Module::onBootstrap方法会在事件MvcEvent::EVENT_BOOTSTRAP触发时执行,但是每个模块的Module::onBootstrap的附件该事件的 code> 方法取决于模块加载的顺序。因此,特定 Module::onBootstrap 方法的执行顺序取决于其他模块的存在以及其他模块如何影响该特定模块的加载顺序。此外,附加到 MvcEvent::EVENT_BOOTSTRAP 事件且优先级大于 1 的任何监听器都将在任何模块 Module::onBootstrap 方法之前执行,例如 ViewManager: :onBootstrap 监听器。所以,为了实现我想要的

I need that some code be executed before any MvcEvent::EVENT_BOOTSTRAP listener get execute

模块 obBootstrap 方法不是一个选项。

最佳答案

这是一篇非常旧的帖子,但由于没有答案被接受,而且我最近需要实现同样的目标,所以我想分享我的解决方案。

我需要在触发 Bootstrap 事件之前访问 ServiceManager 的原因是,我可以使用从数据库检索的值来操作合并的配置。

问题:

在 Zend documentation 中找到的示例展示了如何操作合并的配置,但在特定时间服务管理器是空的,因此无法检索数据库适配器等内容。

解决方案:

在您的模块类中,实现接口(interface)InitProviderInterface并添加适当的方法。

public function init(ModuleManagerInterface $moduleManager)
{
$eventManager = $moduleManager->getEventManager();
$eventManager->attach(ModuleEvent::EVENT_LOAD_MODULES_POST, [$this, 'onLoadModulesPost']);
}

EVENT_LOAD_MODULES_POST 事件将在 EVENT_MERGE_CONFIG 事件之后、EVENT_BOOTSTRAP 事件触发之前调用。此外,在这个特定时间,ServiceManager 将包含您想要访问的所有工厂和可调用类。

您的回调方法可能看起来像这样。

public function onLoadModulesPost(ModuleEvent $event)
{
/* @var $serviceManager \Zend\ServiceManager\ServiceManager */
$serviceManager = $event->getParam('ServiceManager');
$configListener = $event->getConfigListener();
$configuration = $configListener->getMergedConfig(false);

$someService = $serviceManager->get('Your/Custom/Service');
$information = $someService->fetchSomeInformation();
$configuration = array_merge($configuration, $information);

$configListener->setMergedConfig($configuration);
$event->setConfigListener($configListener);
$serviceManager->setAllowOverride(true);
$serviceManager->setService('Config', $configuration);
$serviceManager->setAllowOverride(false);
}

关于events - 如何在模块的 init 方法(ZF2)内获取对服务管理器的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19527165/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com