Laravel Model Events and Observers Tutorial

Laravel dispatches many model events that help us to listen to many model lifecycles like created, updated, saved, deleting, deleted, and more. If you want to listen to more events of a specific model, then you can create an Observer class to group all the events into a single class.

To set up a Laravel model Observers, follow the below steps.

  1. Create model Observer class
  2. Add listeners for different events
  3. Register observer in service provider

Before diving deep into the above steps in this tutorial, I would like to look into some model events.

Here are some different model events available in Laravel.

creatingTriggered just before the record is getting saved for the first time.
createdTriggered after a new record was created and saved.
updatingTriggered just before an existing record is getting updated.
updatedTriggered after an existing record was updated.
savingTriggered just before the record is saved (for both new and existing records).
savedTriggered after the record has been saved (for both new and existing records).
deletingTriggered just before a record is getting deleted.
deletedTriggered after a record was deleted.
restoringTriggered just before a soft-deleted record is going to be restored.
restoredTriggered after a soft-deleted record was restored.

You can listen to the created event in the model class as given below.

protected static function boot()
{
    parent::boot();
    static::created(function ($user) {
        $user->uuid = "some_random_string";
        $user->save();
    });
}

If you are going to listen to many model events, then you can go for model Observers in Laravel.

Model Observers are separate classes that observe many events of specific Eloquent models. When an event is triggered on an eloquent model, the corresponding method in its observer will be executed. Each method in the observer class receives the affected model object as its argument.

Create model Observer Class

In our example, we are going to create an Observer class for the User model. The make:observer Artisan command helps us to create a new observer class. 

php artisan make:observer UserObserver --model=User

This will create a file UserObserver.php in app/Observers/ folder. If the Observers folder does not exist, then the above command will create a new folder for you.

Add listeners for different model events

A new Observer class will look like this:

<?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)
    {
        //
    }
    /**
     * Handle the User "updated" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function updated(User $user)
    {
        //
    }
    /**
     * Handle the User "deleted" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function deleted(User $user)
    {
        //
    }
    /**
     * Handle the User "restored" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function restored(User $user)
    {
        //
    }
    /**
     * Handle the User "force deleted" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function forceDeleted(User $user)
    {
        //
    }
}

You can add more observer actions in this class for model events like retrieved, creating, created, updating, updated, saving, saved, deleting, deleted, trashed, forceDeleting, forceDeleted, restoring, restored, and replicating.

Register observer in service provider

The next step is to register the observer class in the EventServiceProvider. Go to the App\Providers\EventServiceProvider service provider and register the Observer in the boot method as given below.

use App\Models\User;
use App\Observers\UserObserver;
 
/**
 * Register any events for your application.
 */
public function boot(): void
{
    User::observe(UserObserver::class);
}

By adding the above codes, UserObserver will observe the model event for the User model.

Model observers can be used to perform various tasks such as updating a cache or sending an email notification need to happen when a specific event occurs on a model.

Conclusion

Laravel model Observers listen to many events happening in a specific Eloquent model to perform various tasks. Use make:observer Artisan command to create a new Observer class file. Add methods to handle different events on this file. Finally, register the observer class in the boot method of EventServiceProvider.