PHP

Automate Actions with Eloquent Model Observers

Centralize logic for responding to Eloquent model lifecycle events like creation, update, and deletion using dedicated observer classes.

// 1. Create the Observer: php artisan make:observer UserObserver --model=User

// In app/Observers/UserObserver.php
namespace App\Observers;

use App\Models\User;
use App\Mail\WelcomeEmail;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Log;

class UserObserver
{
    /**
     * Handle the User "created" event.
     */
    public function created(User $user): void
    {
        Log::info("User {$user->name} ({$user->id}) was created.");
        // Example: Send a welcome email
        Mail::to($user->email)->send(new WelcomeEmail($user));
    }

    /**
     * Handle the User "updated" event.
     */
    public function updated(User $user): void
    {
        Log::info("User {$user->name} ({$user->id}) was updated.");
        // Example: Invalidate a cache for this user
        cache()->forget('user_' . $user->id);
    }

    /**
     * Handle the User "deleted" event.
     */
    public function deleted(User $user): void
    {
        Log::warning("User {$user->name} ({$user->id}) was deleted.");
        // Example: Clean up related resources (e.g., files)
        // Storage::deleteDirectory('user_data/' . $user->id);
    }

    // Other events: saving, retrieved, creating, updating, deleting, restoring, forceDeleted
}

// 2. Register the Observer (e.g., in app/Providers/AppServiceProvider.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::observe(UserObserver::class);
    }
}
How it works: Eloquent observers provide a clean and centralized way to group event listeners for a given model. Instead of scattering event listeners across your application, an observer class contains methods for handling various model lifecycle events (e.g., `created`, `updated`, `deleted`). This promotes single responsibility, improves maintainability, and keeps related logic organized, making it easier to manage side effects like sending emails, logging, or cache invalidation.

Need help integrating this into your project?

Our team of expert developers can help you build your custom application from scratch.

Hire DigitalCodeLabs