在 Symfony 中使用自定义事件而不是依赖项注入对他们有好处吗?

Is their a benefit to use cutom event instead of dependencies injection in Symfony?

我有一个 Mailer 服务负责创建和发送电子邮件。我还有 Registration 确认用户注册的服务。

发送自定义事件、订阅它然后使用 Mailer 服务发送电子邮件而不是仅使用 Registration 中的 Mailer 服务有什么好处注射它?

我有点困惑。第一个似乎更难维护,但我已经看到太多次了,也许我应该考虑一下。

也就是说。我应该这样做吗:

class Registration
{
    public function __construct(EventDispatcherInterface $eventDispatcher)
    {
        $this->eventDispatcher = $eventDispatcher;
    }

    public function confirm()
    {
        // ...

        $this->eventDispatcher->dispatch('myApp.registration.confirmed', new MyCustomEvent());
    }
}

class RegistrationSubscriber implements EventSubscriberInterface
{
    public function __construct(Mailer $mailer)
    {
        $this->mailer = $mailer;
    }

    // ...

    public function onRegistrationConfirmed(MyCustomEvent $event)
    {
        // ...

        $this->mailer->sendRegistrationConfirmedEmail();
    }
}

或者这个:

class Registration
{
    public function __construct(Mailer $mailer)
    {
        $this->mailer = $mailer;
    }

    public function confirm()
    {
        // ...

        $this->mailer->sendRegistrationConfirmedEmail();
    }
}

事件驱动系统有点难以维护,因为它在应用程序逻辑中添加了更多的抽象。我的意思是您需要跟踪哪些事件有订阅者(如果有的话)。但实际上这是唯一的缺点/服务之间没有直接关系/。最大的优势是不同的服务是分离的,你可以为每个事件添加尽可能多的订阅者。在您提到的情况下,可以有 UserRegisteredEvent,它可以让订户发送欢迎电子邮件,另一个可以设置他的工作场所或在此甚至做其他事情。