Событие saved
Событие saved в Laravel срабатывает после того, как модель была успешно сохранена в базу данных. Это событие вызывается как при создании новой записи, так и при обновлении существующей. Оно является частью системы событий Eloquent и позволяет выполнять дополнительные действия после сохранения модели.
Событие saved отличается от saving тем, что первое срабатывает после сохранения, а второе - до. Это важно учитывать при планировании логики приложения, так как в обработчике saved вы уже можете быть уверены, что данные записаны в базу.
Регистрация обработчика
Обработчик события saved можно зарегистрировать в методе boot модели:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Article extends Model
{
protected static function boot()
{
parent::boot();
static::saved(function ($model) {
// Логика после сохранения
});
}
}
?>
Также можно использовать классы слушателей или зарегистрировать событие в EventServiceProvider:
<?php
namespace App\Providers;
use App\Models\Article;
use App\Listeners\LogArticleSaved;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
class EventServiceProvider extends ServiceProvider
{
protected $listen = [
\Illuminate\Database\Eloquent\Events\Saved::class => [
LogArticleSaved::class,
],
];
}
?>
Синтаксис
Событие saved применяется к модели и вызывается автоматически. В обработчик передаётся экземпляр модели, к которому можно обращаться через параметр замыкания:
<?php
static::saved(function ($model) {
// $model - сохранённая модель
$model->field; // Доступ к полям
});
?>
Пример
Давайте создадим логирование после сохранения статьи:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Log;
class Article extends Model
{
protected static function boot()
{
parent::boot();
static::saved(function ($model) {
Log::info('Article saved', [
'id' => $model->id,
'title' => $model->title,
]);
});
}
}
?>
Теперь при сохранении статьи в лог будет записываться информация:
<?php
use App\Models\Article;
Route::get('/save-article', function () {
$article = new Article();
$article->title = 'New Article';
$article->text = 'This is a new article';
$article->save();
echo "Article saved successfully";
});
?>
Результат выполнения кода (лог-файл):
"[2026-09-07 12:00:00] local.INFO: Article saved {\"id\":1,\"title\":\"New Article\"}"
Пример
Давайте отправим уведомление после обновления модели:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Mail;
use App\Mail\UserUpdated;
class User extends Model
{
protected static function boot()
{
parent::boot();
static::saved(function ($user) {
if ($user->wasChanged()) {
Mail::to($user->email)->send(new UserUpdated($user));
}
});
}
}
?>
В этом примере письмо отправляется только если были изменены какие-либо поля модели:
<?php
use App\Models\User;
Route::post('/update-user/{id}', function ($id) {
$user = User::find($id);
$user->name = 'John Doe';
$user->save();
echo "User updated successfully";
});
?>
Пример
Давайте используем событие для обновления связанных данных:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Order extends Model
{
protected static function boot()
{
parent::boot();
static::saved(function ($order) {
// Обновляем общую сумму заказа
$total = $order->items()->sum('price');
$order->total = $total;
$order->saveQuietly(); // Сохраняем без запуска событий
});
}
public function items()
{
return $this->hasMany(OrderItem::class);
}
}
?>
При сохранении заказа автоматически пересчитывается общая сумма:
<?php
use App\Models\Order;
use App\Models\OrderItem;
Route::post('/create-order', function () {
$order = new Order();
$order->customer_name = 'John';
$order->save();
$item = new OrderItem();
$item->order_id = $order->id;
$item->price = 100;
$item->save();
// После сохранения товара событие saved
// пересчитает общую сумму заказа
echo "Order created with total: " . $order->refresh()->total;
});
?>
Результат выполнения кода:
"Order created with total: 100"
Смотрите также
-
событие
saving,
которое срабатывает перед сохранением модели -
событие
created,
которое срабатывает после создания записи -
событие
updated,
которое срабатывает после обновления записи -
метод
saveQuietly,
который сохраняет модель без запуска событий