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
});
}
现在你甚至不必担心邮件程序是否可用,但如果它可用,它会触发一个事件,你的侦听器会接收到它