Авто заполнение атрибутов модели.
  • 829

yii2 AttributesBehavior - авто заполнение атрибутов модели

Автор: admin | 02 мая (Ср.) 2018г. в 20ч.30м.

AttributesBehavior автоматически присваивает значения,
указанные для одного или нескольких атрибутов объекта ActiveRecord, когда происходят определенные события.

Чтобы использовать AttributesBehavior, настройте свойство $attributes , которое должно указать
список атрибутов, которые необходимо обновить, и соответствующие события, которые должны инициировать
обновление. Затем настройте значение закрытых массивов с помощью PHP-кода, возвращаемое значение
которого будет использовано для назначения текущему атрибуту. Например,
use yii\behaviors\AttributesBehavior;

public function behaviors()
{
    return [
        [
            'class' => AttributesBehavior::className(),
            'attributes' => [
                'attribute1' => [
                    ActiveRecord::EVENT_BEFORE_INSERT => new Expression('NOW()'),
                    ActiveRecord::EVENT_BEFORE_UPDATE => \Yii::$app->formatter->asDatetime('2017-07-13'),
                ],
                'attribute2' => [
                    ActiveRecord::EVENT_BEFORE_VALIDATE => [$this, 'storeAttributes'],
                    ActiveRecord::EVENT_AFTER_VALIDATE => [$this, 'restoreAttributes'],
                ],
                'attribute3' => [
                    ActiveRecord::EVENT_BEFORE_VALIDATE => $fn2 = [$this, 'getAttribute2'],
                    ActiveRecord::EVENT_AFTER_VALIDATE => $fn2,
                ],
                'attribute4' => [
                    ActiveRecord::EVENT_BEFORE_DELETE => function ($event, $attribute) {
                        static::disabled() || $event->isValid = false;
                    },
                ],
            ],
        ],​

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


Ключ в атрибуте - это название события, при наступлении которого будет заполнен атрибут, а
значение - может быть анонимная функция, вызываемая в формате массива (например, [$this, 'methodName]),
объект Expression, представляющий выражение DB (например, new Expression('NOW()') ), скаляр,
строка или произвольное значение.

Также есть свойство "order". Этот атрибут позволяет задать очередь обработки атрибутов для
оприделенных событий. Это может быть полезно, когда заполнение одних атрибутов зависит от других.
Например, если нужен атрибут fullName, который состоит из данных от атрибутов lastName и firstName.

'order ' => [
    ActiveRecord::EVENT_BEFORE_VALIDATE => ['lastName', 'firstName', 'fullName'],
    ActiveRecord::EVENT_AFTER_VALIDATE => ['isActive', 'isVisible'],
]

skipUpdateOnClean - свойство, которое по умолчанию = true. Означает, как будет реагировать поведение
если модель не была изменена. По умолчанию поведение не будет работать, если ни какой атрибут изменен
не был в базе данных, то есть нет dirtyAttributes в модели. Когда вы вызываете save() для
сохранения Active Record объекта, сохраняются только dirty-атрибуты. dirty-атрибутом считается
тот атрибут, значение которого изменилось с момента выборки из базы данных или он был сохранен
недавно. Если вывести объект Active Record с помощью var_dump, то в списке как раз можно увидеть
какхранятся старые атрибуты и новые атрибуты.


preserveNonEmptyValues - по умолчанию false. Сохранять ли не пустое значение атрибута.
Имеется в виду, что если обробатываемый атрибут уже не пустой, то при true он будет
сохранен как есть и событие не будет его обробатывать. По умолчанию - он будет перезаписан
в соответствии с обработкой в событии.


value - это свойство может быть как результат анонимной функции, в виде [$this, 'methodName'] массива,
или выражение DB (например, new Expression('NOW()') ). Применяется как обработчик для атрибута.
Подходит, если для всех прописанных атрибутов может быть установлен один обработчик. Пример:

    public function behaviors()
    {
        return [
            'attribute' => [
                'class' => AttributeBehavior::className(),
                'value' => function(Event $event) {return Yii::$app->user->id;},
                'attributes' => [
                    ActiveRecord::EVENT_BEFORE_INSERT => ['user_id', 'created_by', 'updated_by'],
                    ActiveRecord::EVENT_BEFORE_UPDATE => 'updated_by',
                ],
            ]
        ];
    }

Приветствую!

Меня зовут Сергей. Я - автор этого блога.

Если Вам был полезен материал на моем сайте, поддержите пожалуйста мой проект, чтобы о нем узнали другие люди - кликните plizz :) на иконку в соц. сети, чтобы поделиться материалом с другими.