我有以下情况: 我触发一个事件的应用程序模块之一,在同一个模块中我创建了一个事件监听器,通过共享事件管理器系统监听该触发器,通过这一步一切正常,我试图在不同的模块中创建更多的监听器事件,他们也工作正常,所有听众都被称为。
我想要的是一个系统,我可以从多个地方触发相同的事件。例如,我创建了一个Send Mail模块,在其中我将有一个监听器,它将监听“sendMail”触发器并执行某些操作,是否可以从不同的模块触发相同的事件?
我试图从2个地方触发相同的事件,但是共享事件的attach方法将第一个参数作为调用者类的id,即触发事件的类的id,这样我就可以触发事件只来自指定的类。 我想要的是从我想要的多个地方触发该事件。 非常感谢你们!
答案 0 :(得分:2)
共享事件管理器允许附加到通配符,因此要附加到foo
事件,无论它是否来源,您都可以执行此操作:
$sharedEventManager->attach('*', 'foo', ...);
有关详细信息,请查看通配符上的EventManager文档页面:http://framework.zend.com/manual/current/en/tutorials/tutorial.eventmanager.html#wildcards
答案 1 :(得分:1)
如果您使用Zend\EventManager\EventManagerAwareTrait
或继承自ZfcBase\EventManager\EventProvider
,您可以提供自己的事件标识符来收听。
如果您查看此处EventManagerAwareTrait::setEventManager()
方法中包含的代码
以及此处的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方法合并的标识符之一。
答案 2 :(得分:0)
为什么使用共享事件管理器?
如果您为“操作”创建服务,则可以初始化a 新的eventmanager,您可以在其中附加您想要的活动。 而且从任何地方都可以触发。
我还建议您附加事件聚合以便于代码审查和可读性