Events ZF2事件触发

Events ZF2事件触发,events,triggers,zend-framework2,eventtrigger,event-triggers,Events,Triggers,Zend Framework2,Eventtrigger,Event Triggers,我有以下情况: 我触发一个事件的一个应用程序模块,在同一个模块中,我创建了一个事件侦听器,通过共享事件管理器系统侦听该触发器,通过这一步,所有侦听器都可以正常工作,我尝试在该事件的不同模块中创建更多侦听器,它们也可以正常工作,所有侦听器都被调用 我想要的是有一个能够从多个地方触发同一事件的系统。例如,我创建了一个sendMail模块,其中有一个侦听器,它将侦听“sendMail”触发器并执行一些操作,是否可以从不同的模块触发相同的事件 我试图从两个位置触发同一事件,但共享事件的attach方法将

我有以下情况: 我触发一个事件的一个应用程序模块,在同一个模块中,我创建了一个事件侦听器,通过共享事件管理器系统侦听该触发器,通过这一步,所有侦听器都可以正常工作,我尝试在该事件的不同模块中创建更多侦听器,它们也可以正常工作,所有侦听器都被调用

我想要的是有一个能够从多个地方触发同一事件的系统。例如,我创建了一个sendMail模块,其中有一个侦听器,它将侦听“sendMail”触发器并执行一些操作,是否可以从不同的模块触发相同的事件

我试图从两个位置触发同一事件,但共享事件的attach方法将第一个参数作为调用方类的id,即触发事件的类的id,这样我只能从指定的类触发事件。 我想要的是从我想要的任何地方触发那个事件。
非常感谢大家

为什么要使用共享事件管理器

如果为“操作”创建服务,则可以初始化 新的eventmanager,您可以在其中根据需要附加事件。 ofc到处扣动扳机


如果您使用
Zend\EventManager\eventmanagerawaretracit
或继承自
ZfcBase\EventManager\EventProvider
,我还建议您附加一个事件聚合,以便于代码审查和可读性

如果您在此处查看
eventmanagerawaretracit::setEventManager()方法中包含的代码

在这里的
ZfcBase\EventManager\EventProvider::setEventManager()

您会注意到,该方法会自动查找名为
$eventIdentifier
的属性,期望该属性是字符串或字符串数组,如果该字符串或字符串数组存在,则会与FQCN和类名的默认标识符合并

因此,基本上,您可以通过向事件管理器感知类(触发事件的类)添加属性来添加自己的标识符

您的侦听器现在只需要附加到
SendMailIdentifier
,而不是针对任何特定类的FQCN


当然,您也可以在必要时附加到FQCN,因为它是由setEventManager方法合并的标识符之一。

共享事件管理器允许附加到通配符,因此要附加到
foo
事件,无论其来源如何,您都可以执行以下操作:

$sharedEventManager->attach(“*”、“foo”、…)


有关更多详细信息,请查看关于通配符的EventManager文档页面:

我对您的示例不太清楚。目标到底是什么?您是在尝试使用“MailModule”在不同的区域发送邮件,还是在发送邮件时尝试执行某些任务?我使用共享事件管理器,因为每个模块中的常规事件管理器不同,即每个模块都初始化了不同的事件管理器。
<?php

namespace Somenamespace; 

use Zend\EventManager\EventManagerAwareInterface;

class EventTriggeringClass implements EventManagerAwareInterface
{
    use \Zend\EventManager\EventManagerAwareTrait;

    protected $eventIdentifier = 'SendMailIdentifier';

}
namespace Someothernamespace;

use Zend\EventManager\EventManagerAwareInterface;

class SomeOtherEventTriggeringClass implements EventManagerAwareInterface
{
    use \Zend\EventManager\EventManagerAwareTrait;

    protected $eventIdentifier = 'SendMailIdentifier';

}