ZF2事件触发

时间:2015-01-23 07:52:02

标签: events triggers zend-framework2 eventtrigger event-triggers

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

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

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

3 个答案:

答案 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()方法中包含的代码

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方法合并的标识符之一。

答案 2 :(得分:0)

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

如果您为“操作”创建服务,则可以初始化a 新的eventmanager,您可以在其中附加您想要的活动。 而且从任何地方都可以触发。

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