Использование save() внутри поведения, прикрепленного к ActiveRecord

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
arogachev
Сообщения: 52
Зарегистрирован: 2014.09.09, 14:32

Использование save() внутри поведения, прикрепленного к ActiveRecord

Сообщение arogachev »

Есть экземпляр ActiveRecord с несколькими зацепленными поведениями.

В одном из них происходит обновление связанных моделей (помимо owner). Использование updateAttributes() не вызывает проблем, но требуется запустить обработчики других поведений в процессе обновления связанных моделей, например, TimestampBehavior, BlameableBehavior, LogBehavior (кастомный).

Если вызвать внутри save(), то рискуем получить рекурсию, плюс в некоторых случаях некоторые поведения должны быть исключены.

Пробую такое решение, но при попытке прикрепить поведения обратно, возникает ошибка.

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

$detachedBehaviors = $this->getDetachedBehaviors();

foreach ($model->behaviors as $key => $behavior) {
    if (in_array($behavior::className(), $detachedBehaviors)) {
        $model->detachBehavior($key);
    }
}

$model->save(false, [$this->attribute]);

$model->attachBehaviors($detachedBehaviors);
Может быть, существует лучшее решение?

Из альтернатив, которые приходят в голову:
  • Вручную вызвать события нужных поведений.

    Использовать updateAttributes() вместо save().
Также не хотелось бы привязывать эту логику к конкретному поведению, а сделать это настраиваемым для любого поведения, что более гибко.
Полагаю, что это будет отдельное поведение.
Мой профиль на Github
Ответить