Погуглил информацию по данной теме, что-то маловато нашлось, пришлось думать самому
Т.к. samdark недавно в одной из тем советовал стараться поменьше делать зависимостей от событий, решил их не использовать совсем.
Идея вот в чем:
Есть commandBus.
При определенных выполненных условиях осуществляется команда:
Код: Выделить всё
Yii::$app->commandBus->handle(new SendEmailCommand([
'action' => SendEmailCommand::ACTION_ACTIVATION,
'params' => [
'user_id' => $this->user_id
]
]));
Код: Выделить всё
Yii::$app->commandBus->handle(new SendEmailCommand([
'action' => SendEmailCommand::ACTION_ORDER_SUCCESS,
'params' => [
'order_id' => $this->order_id
]
]));
Код: Выделить всё
Yii::$app->commandBus->handle(new SendEmailCommand([
'action' => SendEmailCommand::ACTION_FEEDBACK,
'params' => [
'feedback_id' => $this->feedback_id
]
]));
В ней уже в зависимости от действия
Код: Выделить всё
const ACTION_ORDER_SUCCESS = 'order_success';
И отсылается в очередь:
Код: Выделить всё
Yii::$app->queue->push(new SenEmailJob([
'subject' => 'Подтверждение заказа',
'to' => $this->to,
...
]));
1. Можно редактировать всю логику формирования писем в одном месте, не ища по всем контроллерам или моделям, какие же там данные передаются и откуда
2. Независимость от доступности внешних сервисов благодаря очередям
Из минусов:
1. Лишняя нагрузка, т.к. в команде заново запрашивается вся информация о юзере или скажем, о заказе. Впрочем, частично - это плюс, т.к. пришлось бы вытаскивать заказанные товары прямо в actionOrderSuccess()
2. Фиксированный набор экшенов для отправки, придется добавлять новые.
Но можно сделать один дефолтный, в который информация для отправки приходит сразу вся и по прямой отправляется в очередь.
===============
Прошу критики и подсказок, что изменить или добавить в логике. Т.к. осуществил пока только менее чем на половину.
Или, может, сотворил фигню и лучше сделать по-другому?
Спасибо.