← Назад к вопросам

Что такое observer в Laravel?

2.0 Middle🔥 151 комментариев
#Фреймворки

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Observer в Laravel: концепция и практическое применение

Observer (Наблюдатель) в Laravel — это архитектурный паттерн, реализованный через классы-наблюдатели, которые позволяют подписаться на события жизненногоного цикла Eloquent-моделей. Это механизм для выполнения дополнительной логики при создании, обновлении, удалении или восстановлении записей, без внесения изменений в саму модель, что соответствует принципу единой ответственности (Single Responsibility Principle).

Ключевые концепции

В основе Observer лежит событийно-ориентированная архитектура. Вместо того чтобы добавлять побочную логику (логирование, очистку кэша, отправку уведомлений) непосредственно в методы модели, вы выносите её в отдельный класс-наблюдатель, который автоматически срабатывает при наступлении определенных событий модели.

Стандартные события Eloquent, на которые можно подписаться:

  • retrieved — после выборки модели из БД
  • creating / created — до/после создания записи
  • updating / updated — до/после обновления записи
  • saving / saved — до/после создания ИЛИ обновления (срабатывает для обоих операций)
  • deleting / deleted — до/после удаления записи
  • restoring / restored — до/после восстановления записи (из корзины, при использовании Soft Deletes)
  • forceDeleted — после окончательного удаления

Как создать и зарегистрировать Observer

1. Создание класса Observer Используйте Artisan-команду для генерации шаблона класса. Например, для модели User:

php artisan make:observer UserObserver --model=User

Эта команда создаст файл app/Observers/UserObserver.php со следующей структурой:

<?php

namespace App\Observers;

use App\Models\User;

class UserObserver
{
    public function created(User $user): void
    {
        // Логика после создания пользователя
    }

    public function updated(User $user): void
    {
        // Логика после обновления пользователя
    }

    public function deleted(User $user): void
    {
        // Логика после удаления пользователя
    }

    // ... другие доступные методы: retrieved, saving, saved, restoring, restored, forceDeleted
}

2. Регистрация Observer Observer необходимо зарегистрировать. Классическое место для этого — метод boot() сервис-провайдера (чаще всего EventServiceProvider или отдельный ObserverServiceProvider).

<?php

namespace App\Providers;

use App\Models\User;
use App\Observers\UserObserver;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function boot(): void
    {
        // Регистрация наблюдателя для модели User
        User::observe(UserObserver::class);

        // Можно регистрировать несколько наблюдателей для одной модели
        // User::observe([AuditObserver::class, CacheCleanObserver::class]);
    }
}

Практические примеры использования

Observer идеально подходит для следующих задач:

  • Автоматическое ведение логов аудита: Запись в отдельную таблицу информации о том, кто и когда изменил запись.
    public function updated(User $user): void
    {
        ActivityLog::create([
            'user_id' => auth()->id(),
            'action' => 'updated',
            'model_type' => User::class,
            'model_id' => $user->id,
            'changes' => $user->getChanges()
        ]);
    }
    
  • Очистка кэша: При обновлении данных модели инвалидировать соответствующий кэш.
    public function saved(Post $post): void
    {
        Cache::forget("post.{$post->id}");
        Cache::tags(['posts-list'])->flush();
    }
    
  • Отправка уведомлений: Отправка email или push-уведомления после регистрации нового пользователя.
    public function created(User $user): void
    {
        $user->notify(new WelcomeNotification());
        Notification::send($admins, new NewUserRegisteredNotification($user));
    }
    
  • Генерация slug или UUID: Заполнение полей перед сохранением.
    public function creating(Post $post): void
    {
        $post->slug = Str::slug($post->title);
        $post->uuid = Str::uuid();
    }
    
  • Управление зависимыми данными: Каскадное удаление или обновление связанных записей.
    public function deleting(User $user): void
    {
        // Удаляем все связанные профили, посты и т.д.
        $user->posts()->delete();
        $user->profile()->delete();
    }
    

Преимущества и отличия от других подходов

Преимущества использования Observer:

  • Чистота модели: Модель остаётся сосредоточенной только на представлении данных и бизнес-логике, связанной с ними.
  • Повторное использование: Один наблюдатель можно применить к нескольким моделям.
  • Простота тестирования: Логику в наблюдателе можно тестировать изолированно.
  • Согласованность: Код выполняется всегда при срабатывании события, предотвращая ситуации, когда разработчик забыл вызвать побочный метод.

Отличия от Событий (Events) и Слушателей (Listeners):

  • Observer жёстко привязан к событиям жизненного цикла конкретной Eloquent-модели и обычно регистрируется глобально для всех её экземпляров.
  • Events/Listeners — более гибкая и общая система. События могут быть кастомными, генерироваться в любом месте приложения (не только в моделях), а слушатели могут быть анонимными, назначаться условиями (через диспетчер) и иметь очередь.

Важные нюансы

  • События наблюдателей не срабатывают при массовых операциях (update(), delete(), create() на Query Builder), так как они не загружают модели в память. Для таких случаев нужно использовать другие подходы.
  • Порядок вызова методов: savingcreating/updatingcreated/updatedsaved.
  • Если в методе creating или updating выбросить исключение, процесс сохранения будет прерван, и запись в БД не произойдёт.

Заключение: Observer в Laravel — это мощный и элегантный инструмент для реализации сквозной функциональности (cross-cutting concerns), связанной с жизненным циклом данных. Он способствует поддержанию чистого, тестируемого и расширяемого кода, отделяя основную бизнес-логику модели от вторичных действий, которые должны выполняться автоматически.

Что такое observer в Laravel? | PrepBro