Laravel 8 Model Events Tutorial
In this tutorial, we'll learn about model events in Laravel 8 for using them in our CRM application to update the role of the user to an admin before saving it to the database.
The Laravel 8 ORM provides powerful abstractions for working with the supported databases. One of the features of Eloquent is the implementation of the observer pattern for sending and listening to events sent by Laravel 8 models when actions such as creating or saving models are executed.
If you are not familiar with the observer pattern, it's simply:
A software design pattern in which an object, called the subject, maintains a list of its dependents, called observers, and notifies them automatically of any state changes, usually by calling one of their methods. You can find more information on Wikipedia.
Design patterns are simply common solutions to problems in software development, that are well tested and tried by developers.
Laravel 8 Model Events
A Model in Laravel 8 provides an abstraction for working with a database table with a high-level API. Among these APIs, are events which are fired when actions are performed on the model.
Models events are simpy hooks into the important points of a model's lifecycle which you can use to easily run code when database records are saved, updated or deleted.
Events receive the instance of the model which is being saved, updated or deleted.
These are the events that you can use with your Laravel models:
-
creating
andcreated
: sent before and after records have been created. -
updating
andupdated
: sent before and after records are updated. -
saving
andsaved
: sent before and after records are saved (i.e created or updated). -
deleting
anddeleted
: sent before and after records are deleted or soft-deleted. -
restoring
andrestored
: sent before and after soft-deleted records are restored. -
retrieved
: sent after records have been retrieved.
According to the official website:
The
retrieved
event will fire when an existing model is retrieved from the database. When a new model is saved for the first time, thecreating
andcreated
events will fire. If a model already existed in the database and thesave
method is called, theupdating
/updated
events will fire. However, in both cases, thesaving
/saved
events will fire.
Now, let's listen for the saving
event of the User
model and update the role
field to admin
before saving the first record. Open the app/User.php
file and update as follows:
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use Notifiable;
protected $fillable = [
'name', 'email', 'password',
];
protected $hidden = [
'password', 'remember_token',
];
protected $casts = [
'email_verified_at' => 'datetime',
];
protected static function boot()
{
parent::boot();
User::saving(function ($model) {
if(!User::where("role","=", "admin")->exists())
{
$model->role = 'admin';
}
});
}
}
We simply added a static boot()
method to our User
model. Inside this method, we called the saving()
method and we passed a closure function that receives the instance of the User model which is being saved.
Inside the saving()
listener function, we check if a user with an admin role exists in the database, if not we assign the admin value to the role field.
Serving your Laravel 8 App
Now, start your Laravel app if it's not running yet:
$ php artisan serve
Head to the http://localhost:8000
address in your web browser, you should be able to register for a first account with an admin role. After that, the registration will be disabled.
Check out this page of the official docs for another approach of listening to model events using the $dispatchesEvents
property on your Eloquent model and maps various points of the model's lifecycle to your own event classes:
At this point of our tutorial, we have seen how we can listen to the saving
event in our application. While this is enough for implementing the required functionality but let's see how we can use a model observer to do the same.
Conclusion
In this tutorial, we've learned about Laravel 8 Model events and we have seen how to listen for the saving event on the User
model for updating the role of the user being saved.
-
Date: