Связи текущей Модели не передаются в email темплейт [Решено]

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Аватара пользователя
leonenco
Сообщения: 128
Зарегистрирован: 2017.01.30, 22:42

Re: Связи текущей Модели не передаются в email темплейт

Сообщение leonenco » 2019.08.16, 03:02

yiiliveext писал(а):
2019.08.15, 12:30
ElisDN писал(а):
2019.08.15, 11:56
1. Для создания событий \Yii::createObject не нужен.
В данном случае ради краткости. Можно было в две строчки:

Код: Выделить всё

$orderStatusEvent = new OrderStatusEvent();
$orderStatusEvent->status = $order->order_status_id;
ElisDN писал(а):
2019.08.15, 11:56
2. Из одного объекта триггерить события другого - костыль. Зря не сделали метод trigger с модификатором protected.
Да, немного костыль. Но не во всех приложениях нужна идеальная архитектура.
ElisDN писал(а):
2019.08.15, 11:56
3. Оптимальный вариант агрегации с save-relations-behavior. Но всё равно есть нюанс с тем, что если $order->save() выполняется внутри ещё одной внешней транзакции, то OP_ALL с $this->trigger(...) в afterSave сущности тоже пролетает.
Да, этот момент не продуман с транзакциями в ActiveRecord. Но можно отнаследоваться и сделать что-то вроде

Код: Выделить всё

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);
    }
}
Ну и дальше в модели в методе afterCommit уже триггерить событие EVENT_ORDER_STATUS_CHANGED
Спасибо за комент, вижу у вас тоже опыта богаж, я не вижу целесообразности наследовать одну сущьность 'UserOrders' используя ваш метод только для того чтоб отправить emails. Как решение проблемы вы правы, что тем самым мне не нужно вызывать метод 'sendEmails', но на читаемости кода это существенно отразится. Так как большая часть основных моделей написана без переосмысления наследуемых ActiveRecords методов. Это с одной стороны немного нагромождает модели, но с другой мы всегда имеем целостность `core` классов и методов. Также в контроллере теперь стала понятна процедура обработки ордеров, сначала сохранение и только в конце $transaction->commit() и $order->sendEmails(). Дополнительно утановил компонент mailqueue, чтоб ускорить процесс записи ордера без ожидания отправки emails, что существенно отразилсь на скорости работы приложения.

Ответить