首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ZF2事件触发

ZF2事件触发
EN

Stack Overflow用户
提问于 2015-01-23 07:52:01
回答 3查看 734关注 0票数 1

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-01-25 19:42:15

共享事件管理器允许附加到通配符,因此要附加到foo事件,无论它是源,您都可以这样做:

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

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

票数 2
EN

Stack Overflow用户

发布于 2015-01-23 16:36:34

如果使用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和类名的默认标识符合并。

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

代码语言:javascript
复制
<?php

namespace Somenamespace; 

use Zend\EventManager\EventManagerAwareInterface;

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

    protected $eventIdentifier = 'SendMailIdentifier';

}

代码语言:javascript
复制
namespace Someothernamespace;

use Zend\EventManager\EventManagerAwareInterface;

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

    protected $eventIdentifier = 'SendMailIdentifier';

}

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

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

票数 1
EN

Stack Overflow用户

发布于 2015-01-23 12:05:36

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

如果您为您的“操作”创建一个服务,您可以初始化一个新的事件管理器,在那里您可以随时随地附加一个事件。ofc从任何地方都扣动扳机。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28105304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档