PHP

Automating Logic with Eloquent Model Events and Observers

Learn to use Laravel Eloquent model events and observers to automatically trigger actions before or after model creation, updates, deletions, and other lifecycle events.

// --- Method 1: Using Model Events (within the Model) ---
// app/Models/User.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;

class User extends Model
{
    protected static function boot()
    {
        parent::boot();

        // Automatically generate a UUID for new users
        static::creating(function ($user) {
            if (empty($user->uuid)) {
                $user->uuid = (string) Str::uuid();
            }
        });

        // Log whenever a user is updated
        static::updating(function ($user) {
            \Log::info("User {$user->id} updated. New email: {$user->email}");
        });

        // Perform actions after a user is deleted
        static::deleted(function ($user) {
            // For example, delete related files or clear cache
            \Cache::forget('user_profile_' . $user->id);
            \Log::info("User {$user->id} and related cache cleared.");
        });
    }
}

// --- Method 2: Using an Eloquent Observer (for cleaner separation) ---
// 1. Create the Observer: php artisan make:observer UserObserver --model=User
// app/Observers/UserObserver.php
namespace App\Observers;

use App\Models\User;

class UserObserver
{
    /**
     * Handle the User "created" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function created(User $user)
    {
        // Send welcome email, assign default role, etc.
        \Mail::to($user->email)->send(new \App\Mail\WelcomeEmail($user));
        $user->assignRole('default');
    }

    /**
     * Handle the User "updated" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function updated(User $user)
    {
        // Record changes in an audit log
        \AuditLog::create([
            'user_id' => $user->id,
            'action' => 'updated',
            'details' => json_encode($user->getDirty()),
        ]);
    }

    // You can define methods for retrieved, creating, updating, saving,
    // deleting, restoring, forceDeleting
}

// 2. Register the Observer (in App\Providers\AppServiceProvider.php's boot method)
// use App\Models\User;
// use App\Observers\UserObserver;
// ...
// public function boot()
// {
//     User::observe(UserObserver::class);
// }
How it works: Eloquent model events provide hooks into the model's lifecycle, allowing you to execute code automatically when a model is created, updated, deleted, or retrieved. You can define these events directly within the model's `boot` method for simple logic. For more complex or reusable logic, Eloquent Observers offer a dedicated class to house all event listeners for a specific model, promoting better organization and separation of concerns. Register observers in your `AppServiceProvider` or a dedicated service provider.

Need help integrating this into your project?

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

Hire DigitalCodeLabs