【发布时间】:2020-02-06 14:54:26
【问题描述】:
出于各种原因,我希望/需要记录通过我在 Symfony 5 上运行的网站发送的所有电子邮件。
到目前为止,我所拥有的是一个订阅者,它在创建 MessageEvent 类时创建了一个 EmailLogEntry 类型的实体(至少这是我从 (MessageEvent::class) 中理解的——如果我错了,请纠正我)。我还使用此订阅者使用默认系统地址填写缺少的电子邮件地址。
现在,发送电子邮件后,我想调整我的实体并致电$email->setSent(true);,但我不知道如何订阅尝试发送电子邮件的事件。为了代码的可重用性,我不想在服务中这样做(是的,它是多个,因为有多个生成邮件的源)我实际上调用$this->mailer->send($email);。
我现在的问题是:
- 谁能告诉我如何订阅 Mailers send 事件?
- 一般而言,我如何确定可以订阅哪些事件?文档中列出了内核事件,但触发的所有其他事件呢?
顺便说一句,我现在的订阅者代码:
class SendMailSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
MessageEvent::class => [
['onMessage', 255],
['logMessage', 0],
],
];
}
public function logMessage(MessageEvent $event) {
$email = new EmailLogEntry();
[...]
}
}
谢谢。
【问题讨论】:
-
stackoverflow.com/questions/18033210/… 中的想法非常类似于您的用例。你应该能够适应它。你也应该避免一次问太多问题。对于事件,请查看
bin/console debug:event*命令 -
不幸的是,该链接适用于 SwiftMailer,而我正在使用 Symfony 的原生新 Mailer。 SwiftMailer 有更多选项可以帮助我解决我的问题...
-
这正是我说“适应它”的原因,因为尽管 Symfony Mailer 与 SwiftMailer 并不完全相同,但我相信它大体上是相同的,因为您可以使用装饰模式来包装它。特别是如果您总是使用
MailerInterface而不是Mailer类型提示。实现起来也很宽容,因为Mailer只有一个功能来装饰(发送)。此外,装饰是正确的方法。供参考见github.com/symfony/mailer/blob/master/Mailer.php(如有必要,可以阅读装饰) -
MessageEvent 的使用条款是否正确?这可能是它不起作用的原因。
-
@Jakumi:好的,我得看看装饰图案的问题——这是我第一次听说。这是我的第一个基于 Symfony 的项目,到目前为止,我正在通过教程或类似问题进行学习。关于使用条款:不,我没有。我找到了关于
use Symfony\Component\Mailer\Event\MessageEvent; use Symfony\Component\Mailer\Event\MessageEvents;的信息,但这就是我通过阅读Mailer 代码文件所能找到的全部内容。 EventListener 文件夹中的所有类也订阅MessageEvent::class并使用MessageEvent
标签: symfony mailer subscriber