Yii2. Методы afterSave() и beforeSave()

21.08.2019

Теги: Web-разработкаYii2БазаДанныхМодельТеорияФреймворк

Метод afterSave()

Как нетрудно догадаться из названия, метод afterSave() модели вызывается после метода save(), который осуществляет сохранение данных в БД. Например, мы хотим записать в сессию сообщение об успешном сохранении записи, чтобы затем вывести это сообщение в шаблоне. В этом случае просто добавляем метод afterSave() в класс модели:

class Feedback extends ActiveRecord {
    /*...*/
    public function afterSave($insert, $changedAttributes) {
        parent::afterSave($insert, $changedAttributes);
        Yii::$app->session->setFlash('success', 'Запись сохранена');
    }
    /*...*/
}

А в view-шаблоне показываем это сообщение:

<?php if (Yii::$app->session->hasFlash('success')): ?>
    <div class="alert alert-success alert-dismissible" role="alert">
        <button type="button" class="close" data-dismiss="alert" aria-label="Close">
            <span aria-hidden="true">&times;</span>
        </button>
        <?= Yii::$app->session->getFlash('success'); ?>
    </div>
<?php endif; ?>

Сейчас одно и то же сообщение мы видим как в случае обновления записи, так и в случае ее создания. А что если мы захотим показывать различные сообщения в зависимости от выполненной операции?

Здесь нам поможет первый параметр метода afterSave()$insert. Данный параметр принимает булево значение: true — если запись новая или false — если запись обновляется.

class Feedback extends ActiveRecord {
    /*...*/
    public function afterSave($insert, $changedAttributes) {
        if ($insert) {
            Yii::$app->session->setFlash('success', 'Запись добавлена');
        } else {
            Yii::$app->session->setFlash('success', 'Запись обновлена');
        }
        parent::afterSave($insert, $changedAttributes);
    }
    /*...*/
}

Метод beforeSave()

Метод модели beforeSave() вызывается перед вызовом метода save() и позволяет, например, изменить данные перед сохранением в базу данных:

class Feedback extends ActiveRecord {
    /*...*/
    public function beforeSave($insert) {
        if (parent::beforeSave($insert)) {
            $this->updated = new Expression('NOW()');
            if ($insert) {
                $this->created = new Expression('NOW()');
            }
            return true;
        }
        return false;
    }
    /*...*/
}

Здесь нам необходимо вернуть результат родительского метода, иначе потом, при вызове метода save() сохранения модели не произойдёт. И ошибок мы никаких не получим.

Поиск: Web-разработка • Yii2 • База данных • Модель • Фреймворк • afterSave • beforeSave

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.