Спасибо за комент, вижу у вас тоже опыта богаж, я не вижу целесообразности наследовать одну сущьность 'UserOrders' используя ваш метод только для того чтоб отправить emails. Как решение проблемы вы правы, что тем самым мне не нужно вызывать метод 'sendEmails', но на читаемости кода это существенно отразится. Так как большая часть основных моделей написана без переосмысления наследуемых ActiveRecords методов. Это с одной стороны немного нагромождает модели, но с другой мы всегда имеем целостность `core` классов и методов. Также в контроллере теперь стала понятна процедура обработки ордеров, сначала сохранение и только в конце $transaction->commit() и $order->sendEmails(). Дополнительно утановил компонент mailqueue, чтоб ускорить процесс записи ордера без ожидания отправки emails, что существенно отразилсь на скорости работы приложения.yiiliveext писал(а): ↑2019.08.15, 12:30В данном случае ради краткости. Можно было в две строчки:Код: Выделить всё
$orderStatusEvent = new OrderStatusEvent(); $orderStatusEvent->status = $order->order_status_id;
Да, немного костыль. Но не во всех приложениях нужна идеальная архитектура.
Да, этот момент не продуман с транзакциями в ActiveRecord. Но можно отнаследоваться и сделать что-то вродеНу и дальше в модели в методе afterCommit уже триггерить событие EVENT_ORDER_STATUS_CHANGEDКод: Выделить всё
class MyActiveRecord extends \yii\db\ActiveRecord { const EVENT_AFTER_COMMIT = 'afterCommit'; public function insert($runValidation = true, $attributes = null) { $result = parent::insert($runValidation, $attributes); if ($result && $this->isTransactional(self::OP_INSERT)) { $this->afterCommit(); } } public function afterCommit() { $this->trigger(self::EVENT_AFTER_COMMIT); } }