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">×</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