PHP

Automating Actions with Laravel Eloquent Model Observers

Implement robust logic before or after model events like creating, updating, or deleting using Laravel Eloquent Observers, centralizing and organizing model lifecycle actions.

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

use App\Models\User;
use Illuminate\Support\Facades\Hash;

class UserObserver
{
    /**
     * Handle the User "creating" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function creating(User $user)
    {
        // Hash password before a new user is created
        if (isset($user->password) && !Hash::needsRehash($user->password)) {
            $user->password = Hash::make($user->password);
        }
    }

    /**
     * Handle the User "updating" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function updating(User $user)
    {
        // Rehash password if it's been changed and needs rehashing
        if ($user->isDirty('password') && isset($user->password) && !Hash::needsRehash($user->password)) {
            $user->password = Hash::make($user->password);
        }
    }

    /**
     * Handle the User "deleted" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function deleted(User $user)
    {
        // Clear related data (e.g., delete user's profile picture from storage)
        // Storage::disk('public')->delete('avatars/' . $user->id . '.jpg');
    }

    // Other events include: retrieved, created, updated, saved, restored, forceDeleted
}

// app/Providers/AppServiceProvider.php (or a dedicated ObserverServiceProvider)
namespace App\Providers;

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

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     */
    public function register(): void
    {
        //
    }

    /**
     * Bootstrap any application services.
     */
    public function boot(): void
    {
        User::observe(UserObserver::class);
        // Other models can observe their respective observers here
        // Post::observe(PostObserver::class);
    }
}

// Usage Example (e.g., in a controller or test)
$user = User::create([
    'name' => 'John Doe',
    'email' => '[email protected]',
    'password' => 'secretpassword', // Password will be hashed by the observer
]);

$user->email = '[email protected]';
$user->save(); // 'updating' event fired

// $user->delete(); // 'deleted' event fired
How it works: Eloquent model observers provide a clean, centralized way to group event listeners for a model. Instead of defining many event listeners in your model or a service provider, an observer class can handle all relevant events (`creating`, `created`, `updating`, `updated`, `deleting`, `deleted`, `saving`, `saved`, `retrieved`, `restoring`, `restored`, `forceDeleting`, `forceDeleted`). This promotes a single responsibility principle and keeps your models cleaner. To use an observer, create a class with methods named after the events (e.g., `creating(User $user)`). Then, register the observer for its model in the `boot()` method of a service provider using `Model::observe(ObserverClass::class)`.

Need help integrating this into your project?

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

Hire DigitalCodeLabs