gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:47:23 27 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 方法的执行顺序取决于存在的其他模块以及其他模块如何影响特定模块的加载顺序。此外,无论优先级大于 1 的附加到 MvcEvent::EVENT_BOOTSTRAP 事件的监听器都将在任何模块 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/

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