Dependencies 如何在不修改每个侦听器的服务工厂的情况下将侦听器附加到服务?

Dependencies 如何在不修改每个侦听器的服务工厂的情况下将侦听器附加到服务?,dependencies,zend-framework2,zend-framework-modules,Dependencies,Zend Framework2,Zend Framework Modules,我在模块Mail的服务配置中加入了一个非常简单的类 'factories' => array( 'mailer' => function (ServiceLocatorInterface $sl) { return new \Project\Mail\Mailer(); } ) 现在,Mailer使用EventManager触发事件。我希望附加一个侦听器类,每当Mailer发送电子邮件失败时,该类将记录一个错误,但我希望这样做,而不必每次附加新的侦听

我在模块
Mail
的服务配置中加入了一个非常简单的类

'factories' => array(
    'mailer' => function (ServiceLocatorInterface $sl) {
        return new \Project\Mail\Mailer();
    }
)
现在,
Mailer
使用
EventManager
触发事件。我希望附加一个侦听器类,每当
Mailer
发送电子邮件失败时,该类将记录一个错误,但我希望这样做,而不必每次附加新的侦听器时修改
Mailer


如何设置
Mailer
类,以便可以从其他模块附加侦听器?

您必须首先确定“
Mailer
发送电子邮件失败”是什么意思。如果可以在
Mailer
类中检查此情况,则必须触发相应的
mail.error
或类似事件

然后,您必须将侦听器连接到
Mailer
内部的
EventManager
,以侦听此
mail.error
事件并记录错误

Mailer中的触发错误
让我们假设我们的
Mailer
类如下所示:


您必须首先确定“
邮件发送失败”是什么意思。如果可以在
Mailer
类中检查此情况,则必须触发相应的
mail.error
或类似事件

然后,您必须将侦听器连接到
Mailer
内部的
EventManager
,以侦听此
mail.error
事件并记录错误

Mailer中的触发错误
让我们假设我们的
Mailer
类如下所示:


您不需要在类中设置任何触发事件,只需监听它们

尽管@user2257808的答案有效,但这并不是最有效的方法,因为从服务管理器获取邮件程序的行为会创建一个实例,即使应用程序的其余部分不需要实例

更好的方法是将侦听器连接到共享事件管理器,如果触发事件,它将收到通知

这样做与另一个答案非常相似

public function onBootstrap(MvcEvent $event)
{
    $sharedEvents = $event->getApplication()->getEventManager()->getSharedManager();
    // listen to the 'someMailEvent' when triggered by the mailer
    $sharedEvents->attach('Project\Mail\Mailer', 'someMailEvent', function($e) {
         // do something for someMailEvent
    });
}

现在你甚至不必担心邮件程序是否可用,但如果它可用,它会触发一个事件,你的侦听器会接收到它

您不需要在类中设置任何触发事件,您只需要聆听它们

尽管@user2257808的答案有效,但这并不是最有效的方法,因为从服务管理器获取邮件程序的行为会创建一个实例,即使应用程序的其余部分不需要实例

更好的方法是将侦听器连接到共享事件管理器,如果触发事件,它将收到通知

这样做与另一个答案非常相似

public function onBootstrap(MvcEvent $event)
{
    $sharedEvents = $event->getApplication()->getEventManager()->getSharedManager();
    // listen to the 'someMailEvent' when triggered by the mailer
    $sharedEvents->attach('Project\Mail\Mailer', 'someMailEvent', function($e) {
         // do something for someMailEvent
    });
}
现在你甚至不必担心邮件程序是否可用,但如果它可用,它会触发一个事件,你的侦听器会接收到它