在 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,它可以让订户发送欢迎电子邮件,另一个可以设置他的工作场所或在此甚至做其他事情。
我有一个 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,它可以让订户发送欢迎电子邮件,另一个可以设置他的工作场所或在此甚至做其他事情。