zf3侦听在其他类中触发的事件



我被这个问题困扰了一段时间。当我触发各种事件时,我为每个实体提供服务

例如在ArticleServicesaveArticle方法中

$this->triggerEvent('articleSaved', ['saved' => $entity]);

然后我创建了一个单独的监听器,如下面的

class ArticleSavedListener implements ListenerAggregateInterface
{
// ...

public function attach(EventManagerInterface $events, $priority = 100)
{
$this->listeners[] = $events->attach(
Events::ARTICLE_SAVED,
[$this, 'onSaved'],
$priority
);
}
public function onSaved($event)
{
//logic here
}
}

以及在Module.php 中的注册

class Module
{
public function onBootstrap()
{
$application = $e->getApplication();
$serviceManager = $application->getServiceManager();

$eventManager = $application->getEventManager();
$articleService = $serviceManager->get(ArticleService::class);
$articleSavedListener = $serviceManager->get(ArticleSavedListener::class);
$articleSavedListener->attach($articleService->getEventManager());
}
}

重点是,我需要创建一个通用类(listener(,以非常低的优先级侦听特定事件的所有列表。但对于我所读到的内容,自从我宣布它们是私有的以来,我不能在注册类范围之外听它们。

需要帮助。

通过在我的所有映射器服务工厂$container->get('EventManager')中注入默认EventManager来解决它。。。也许不是我所期望的,但没有其他选择

例如HelpCenter\Service\AbstractServiceFactory.php

class AbstractServiceFactory implements FactoryInterface
{
// ...
/**
* @param ContainerInterface $container
* @param string $requestedName
* @param array|null $options
* @return mixed|object
*/
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
$objectManager = $container->get('doctrine.documentmanager.odm_default');
$moduleOptions = $container->get(ModuleOptions::class);
$logger = $container->get('app_logger');
$eventManager = $container->get('EventManager');
/* @var $service AbstractServiceInterface */
$service = new $requestedName($objectManager, $moduleOptions);
$service->setLogger($logger);
$service->setEventManager($eventManager);
return $service;
}
}