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

Ответ

Observer в Laravel — это класс, который прослушивает события жизненного цикла модели Eloquent (создание, обновление, удаление) и позволяет выносить побочную логику из самой модели, соблюдая принцип единственной ответственности (SRP).

Типичные сценарии использования:

  • Отправка уведомлений (email, push) после создания пользователя.
  • Очистка кэша при обновлении статьи.
  • Ведение логов аудита или мягкое удаление связанных записей.

Создание и регистрация Observer:

php artisan make:observer UserObserver --model=User

Код Observer (app/Observers/UserObserver.php):

<?php

namespace AppObservers;

use AppModelsUser;
use AppNotificationsWelcomeNotification;

class UserObserver
{
    public function created(User $user): void
    {
        // Отправляем приветственное письмо асинхронно через очередь
        $user->notify(new WelcomeNotification());
    }

    public function updating(User $user): void
    {
        // Логируем, кто и когда изменил запись
        $user->last_updated_by = auth()->id();
    }

    public function deleted(User $user): void
    {
        // Мягко удаляем связанные профили
        $user->profile()->delete();
    }
}

Регистрация в AppProvidersEventServiceProvider:

protected $observers = [
    User::class => [UserObserver::class],
];

Преимущества: Чистые модели, централизованное управление побочными эффектами, легкость тестирования логики, реагирующей на события.

Ответ 18+ 🔞

А, слушай, Observer в Laravel — это такая штука, которая как будто подглядывает за твоей моделью, пока та живёт своей жизнью. Создали юзера, обновили, удалили — а этот наблюдатель, как хитрая жопа, всё видит и может своё дело тихонько сделать. Главная фишка — вынести всю побочную ересь из самой модели, чтобы она не превращалась в пиздопроебибну на тысячу строк. Принцип единственной ответственности, ёпта, не просто так придумали.

Где это может пригодиться, блядь?

  • Отправить юзеру письмо с «добро пожаловать» сразу после регистрации. Чтобы не пиздовать логику отправки прямо в контроллере.
  • Почистить кэш, когда статью обновили. А то потом сидишь и думаешь, почему на сайте хуйня старая показывается.
  • Логировать, кто и когда что поменял, или тихонько удалить связанные записи, когда главную удалили.

Создаётся эта мартышлюшка просто:

php artisan make:observer UserObserver --model=User

А внутри (app/Observers/UserObserver.php) выглядит примерно так:

<?php

namespace AppObservers;

use AppModelsUser;
use AppNotificationsWelcomeNotification;

class UserObserver
{
    public function created(User $user): void
    {
        // Кидаем приветственное уведомление в очередь, чтобы не тормозить
        $user->notify(new WelcomeNotification());
    }

    public function updating(User $user): void
    {
        // Типа аудит: кто последний лапал запись
        $user->last_updated_by = auth()->id();
    }

    public function deleted(User $user): void
    {
        // Аккуратно прибиваем связанный профиль, чтоб мусора не осталось
        $user->profile()->delete();
    }
}

Прописать его надо в AppProvidersEventServiceProvider, чтоб он вступил в силу:

protected $observers = [
    User::class => [UserObserver::class],
];

В чём кайф, бля? Модели остаются чистыми, как слеза младенца, вся побочная логика в одном месте, и тестировать эту хуйню — одно удовольствие. Вместо того чтобы в каждом контроллере повторять одно и то же, ты просто знаешь: создался юзер — Observer уже ебёт ему письмо в очередь. Удобно, ёбана!