1

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

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

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

4

3 回答 3

2

共享事件管理器允许附加到通配符,所以要附加到一个foo事件,无论它的源是什么,你都可以这样做:

$sharedEventManager->attach('*', 'foo', ...);

有关更多详细信息,请查看有关通配符的 EventManager 文档页面:http: //framework.zend.com/manual/current/en/tutorials/tutorial.eventmanager.html#wildcards

于 2015-01-25T19:42:15.903 回答
1

如果您使用Zend\EventManager\EventManagerAwareTrait或继承自ZfcBase\EventManager\EventProvider您可以提供您自己的事件标识符来收听。

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

https://github.com/zendframework/zf2/blob/master/library/Zend/EventManager/EventManagerAwareTrait.php#L44-L54

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

https://github.com/ZF-Commons/ZfcBase/blob/master/src/ZfcBase/EventManager/EventProvider.php#L26-L37

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

所以基本上,您可以通过简单地将属性添加到事件管理器感知类(触发事件的类)来添加自己的标识符

<?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';

}

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

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

于 2015-01-23T16:36:34.417 回答
0

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

如果您为“操作”创建服务,则可以初始化一个新的事件管理器,您可以在其中随心所欲地附加事件。并且ofc从任何地方扣动扳机。

我还建议您附加一个事件聚合,以便于代码审查和可读性

于 2015-01-23T12:05:36.977 回答