- Я думаю, что нет смысла писать порт для почтовой службы, потому что этот порт будет просто огромной абстракцией копирования / вставки фреймворковой службы
Я бы создал Notification
интерфейс, который я передаю интерактивному сценарию использования, аналогично EntityGateway
или EntityRepository
.
Я бы спроектировал интерфейс Notification
таким образом, чтобы он абстрагировался отконкретный механизм уведомления, например, электронная почта, мессенджер и т. д.
В таком случае Notification
может выглядеть следующим образом:
public interface Notification {
public void notifyUserRegistered(User user);
}
Реализация будет размещена на внешнем уровне, обычноуровень адаптеров интерфейса.Потому что это уровень, где интерфейсы внутренних уровней адаптируются - поэтому название.
Такой Notification
интерфейс может быть легко смоделирован в тесте, и это поддерживает ваши тесты быстрыми.Таким образом, я не вижу интерфейс уведомлений как огромную абстракцию копирования / вставки.
Interactor не может отправить электронное письмо после создания пользователя, поскольку пользователь, наконец, будет сохранен после Doctrine flush () внутри контроллера.Существует риск, когда мы отправили электронное письмо, но Пользователь не был сохранен в БД.Оно должно быть согласованным.
Во-первых, я полагаю, что в любом случае вы не можете сделать и то и другое, потому что отправка электронного письма не участвует в транзакции db.Таким образом, у вас все еще будет проблема согласованности.
Но вы обычно можете зарегистрироваться в активной транзакции, чтобы получать информацию об ее успешном завершении.Это означает, что реализация Notification
просто зарегистрирует обратный вызов, который вызывается после завершения транзакции.Затем вы можете отправить электронное письмо.
Я не знаю, как это можно сделать в php, возможно, это еще один вопрос здесь, на SO.В Java есть несколько способов, в зависимости от используемого API транзакции.
Для Spring взгляните на Связанные с транзакцией события или JEE's TransactionSynchronizationRegistry .Просто упомянуть некоторых, если разработчики Java читают это.