Есть у нас команда UserSignUpCommand и UserSignUpHandler. Хендлер следующего вида
Код: Выделить всё
class SignUpHandler implements CommandHandler
{
protected $userRepository;
protected $eventDispatcher;
protected $userFactory;
public function __construct(
UserRepository $userRepository,
EventDispatcher $eventDispatcher,
UserFactory $userFactory
)
{
$this->userRepository = $userRepository;
$this->userFactory = $userFactory;
$this->eventDispatcher = $eventDispatcher;
}
/**
* @param $command SignUpCommand
*/
public function handle($command)
{
$user = $this->userFactory->signUp();
$this->userRepository->add($user);
$this->eventDispatcher->dispatch($user->releaseEvents());
}
}
Собственно вопросы:
1. Создание через фабрику - по сути обычное создание сущности через гидрацию, т.к. в конструкторе выкидывается событие создания.
Думал в сторону создания сущности через конструктор, а через нестатичные методы вроде create() и signUp() уже просто выбрасывать нужные события. Насколько верный такой подход?
2. Насколько верно создавать сущность через "именованные конструкторы"?
3. Каким образом будет верно реализовать генерацию и отправки токена для подтверждения E-mail? Пока думаю в сторону запуска внутри хендлера дополнительных команд CreateEmailConfirmTokenCommand, и внутри этой команды запускать ещё и SendEmailConfirmTokenCommand, насколько верным будет такой подход?
4. Может ли команда принимать сущность в качестве аргумента?
5. Насколько верно в фабрике переводить сущность в состояние массива (например $userFactory->toState(User $user))? Или всё таки писать для конвертации состояний отдельный маппер?