我有以下情况:我是一个应用程序模块,我触发了一个事件,在同一个模块中,我创建了一个事件侦听器,它通过共享事件管理器系统监听该触发器,通过这个步骤,所有的侦听器都能正常工作,我尝试在不同的模块中创建更多的侦听器,它们也很好,所有侦听器都会被调用。
我想要的是有一个能够从多个地方触发相同事件的系统。例如,我创建了一个发送邮件模块,其中我将有一个侦听器来侦听"sendMail“触发器并执行一些操作,是否可以从不同的模块触发相同的事件?
我试图从两个位置触发相同的事件,但是共享事件的附加方法将第一个参数作为调用者类的id,即触发事件的类的id,这样我只能从指定的类触发事件。我想要的是从我想要的地方触发这个事件。非常感谢大家!
发布于 2015-01-25 19:42:15
共享事件管理器允许附加到通配符,因此要附加到foo事件,无论它是源,您都可以这样做:
$sharedEventManager->attach('*', 'foo', ...);
有关详细信息,请参阅通配符上的EventManager文档页面:http://framework.zend.com/manual/current/en/tutorials/tutorial.eventmanager.html#wildcards
发布于 2015-01-23 16:36:34
如果使用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方法合并的标识符之一。
发布于 2015-01-23 12:05:36
为什么使用共享事件管理器?
如果您为您的“操作”创建一个服务,您可以初始化一个新的事件管理器,在那里您可以随时随地附加一个事件。ofc从任何地方都扣动扳机。
我还建议您附加一个事件聚合,以便于代码检查和可读性。
https://stackoverflow.com/questions/28105304
复制相似问题