FitTech
@FitTech

Как сделать behavior для события afterSave?

Подскажите, пожалуйста, как создать behavior для моделей?
Есть две модели: User и Staff (Active Record сущности), у них есть общие действия при afterSave($insert, $changedAttributes).
Хочу вынести это в behavior.
Создал класс myBehavior extends AttributeBehavior
в events подписался на event after insert
Перенес сюда public function afterSave($insert, $changedAttributes), а в моделях в behavior просто подключил myBehavior::className()
Когда сохраняю пользователя, срабатывает afterSave, но insert и changeAttributes не передались. Почему так и как сделать правильно?

<?php

namespace frontend\components;

use common\models\Log;
use yii\behaviors\AttributeBehavior;
use yii\db\ActiveRecord;

class EntityLogBehavior extends AttributeBehavior
{

    public function events()
    {
        return [
            ActiveRecord::EVENT_AFTER_INSERT => 'afterSave',
        ];
    }


    /**
     * @param bool $insert
     * @param array $changedAttributes
     */
    public function afterSave($insert, $changedAttributes)
    {
        parent::afterSave($insert, $changedAttributes);
        // some logic
        Log::add(Yii::$app->user->identity->id, $this::className(), $this->id, $action);
    }
}



// А это в модели User
    /**
     * @inheritdoc
     */
    public function behaviors()
    {
        return [
            EntityLogBehavior::className()
        ];
    }
  • Вопрос задан
  • 2087 просмотров
Решения вопроса 1
qonand
@qonand
Software Engineer
уж извините за грубость но Вы написали бред который и не может работать, во первых при срабатывании поведения на события в указанную функцию передается не заданные Вами атрибуты а экземпляр класса yii\base\Event т.е. никаких $insert и $changedAttributes не будет передано, в Вашем случае в метод будет передан экземпляр класса yii\db\AfterSaveEvent. Во вторых зачем Вы наследуетесь от AttributeBehavior? по коду смысла от этого наследования нет, кроме того метода afterSave, который Вы вызываете в коде
parent::afterSave($insert, $changedAttributes);
в классе AttributeBehavior нет. А правильно реализовать Ваше поведение приблизительно так:
class EntityLogBehavior extends \yii\base\Behavior
{
    public function events()
    {
        return [
            ActiveRecord::EVENT_AFTER_INSERT => 'afterSave',
        ];
    }

    public function afterSave($event)
    {
        $event->changedAttributes // читаем и что-то делаем с измененными атрибутами
    }
}


P.S. настоятельно рекомендую детально изучить саму концепцию поведений
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы