Событие updating
Событие updating относится к модели Eloquent и вызывается
в момент обновления существующей записи, непосредственно
перед сохранением изменений в базу данных. Это событие
позволяет выполнить пользовательский код, например,
для валидации данных, логирования изменений или
модификации атрибутов перед сохранением. Событие
получает экземпляр модели в качестве аргумента,
что позволяет обращаться к его свойствам и методам.
Важно отметить, что событие updating срабатывает
только при вызове методов update и save
для существующей модели, и не вызывается при создании
новой записи. Если вернуть false из обработчика
события, процесс сохранения будет прерван.
Синтаксис
<?php
// В методе boot модели
Model::updating(function ($model) {
// код до сохранения
});
?>
<?php
// В сервис-провайдере
use AppModelsArticle;
Article::updating(function ($article) {
// код до сохранения
});
?>
<?php
// В Observer
class ArticleObserver
{
public function updating(Article $article)
{
// код до сохранения
}
}
?>
Параметры:
-
$modelили конкретный класс модели - экземпляр обновляемой модели.
Пример регистрации в модели
Давайте зарегистрируем событие updating в методе
boot модели Article:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
class Article extends Model
{
protected static function boot()
{
parent::boot();
static::updating(function ($article) {
$article->updated_at = now();
echo "Article is being updated";
});
}
}
?>
Теперь при обновлении статьи будет выводиться сообщение
и автоматически обновляться поле updated_at:
<?php
use AppModelsArticle;
$article = Article::find(1);
$article->title = 'new title';
$article->save();
?>
Результат выполнения кода:
"Article is being updated"
Обратите внимание, что событие сработало до сохранения изменений в базу данных.
Пример использования Observer
Давайте создадим Observer для модели User
и зарегистрируем событие updating:
<?php
namespace AppObservers;
use AppModelsUser;
class UserObserver
{
public function updating(User $user)
{
if ($user->email != $user->getOriginal('email')) {
echo "Email has been changed to: " . $user->email;
}
}
}
?>
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
use AppObserversUserObserver;
class User extends Model
{
public static function boot()
{
parent::boot();
static::observe(UserObserver::class);
}
}
?>
Теперь при изменении email пользователя будет выводиться сообщение:
<?php
use AppModelsUser;
$user = User::find(1);
$user->email = 'new@example.com';
$user->save();
?>
Результат выполнения кода:
"Email has been changed to: new@example.com"
Событие updating позволяет отследить, какие именно
поля были изменены, используя метод getOriginal.
Пример прерывания операции
Давайте запретим обновление записи, если заголовок статьи слишком короткий:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
class Article extends Model
{
protected static function boot()
{
parent::boot();
static::updating(function ($article) {
if (strlen($article->title) < 3) {
return false;
}
});
}
}
?>
Попытка обновить статью с коротким заголовком:
<?php
use AppModelsArticle;
$article = Article::find(1);
$article->title = 'ab';
$res = $article->save();
echo $res;
?>
Результат выполнения кода:
false
При возврате false из обработчика события обновление
не происходит, и метод save возвращает false.
Пример изменения данных перед сохранением
Давайте автоматически приводим заголовок статьи к верхнему регистру перед сохранением:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
class Article extends Model
{
protected static function boot()
{
parent::boot();
static::updating(function ($article) {
$article->title = strtoupper($article->title);
});
}
}
?>
Теперь при обновлении статьи заголовок автоматически преобразуется:
<?php
use AppModelsArticle;
$article = Article::find(1);
$article->title = 'hello world';
$article->save();
echo $article->title;
?>
Результат выполнения кода:
"HELLO WORLD"
Событие updating позволяет модифицировать атрибуты
модели непосредственно перед сохранением в базу данных.