Laravel Model Observers Tutorial Example From Scratch is today’s leading topic. If you are listening to many events on a given model, you may use observers to group all of your listeners into a single class. Observers classes have method names which reflect the Eloquent events you wish to listen for. Each of these methods receives the model as their only argument. Laravel does not include any default directory for observers, so you may create any folder you like to house your observer classes.

Prerequisites

If you are a beginner then you might like the following articles.

Laravel Model Observers

We are going to understand the Model Observers with an example. So let’s get started.

Step 1: Configure The Laravel.

Go to your preferred folder and hit the following command.

composer create-project laravel/laravel --prefer-dist Observer

Now, set up the database in the .env file.

We are going to see the Observer using an add item example. So we need to make three files.

Model File Controller File Migration File

So let us create one by one.

php artisan make:model Item -m

Above command will create Model as well as migration file.

Now, we need to make a controller file.

php artisan make:controller ItemController

Now, add the schema in the migration file.

/** * Run the migrations. * * @return void */ public function up() { Schema::create('items', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->integer('price'); $table->timestamps(); }); }

Now, go to the terminal and hit the following command.

php artisan migrate

It will create the table in the database.



We need to make two routes in the web.php file.

// web.php Route::get('item', 'ItemController@create'); Route::post('item', 'ItemController@store');

Also, we need to make these two functions in the ItemController.php file.

// ItemController.php public function create() { } public function store(Request $request) { }

Step 2: Make View File And Store The Data.

First, we are going to make that view file.

<!doctype html> <html> <head> <link href="{{asset('css/app.css')}}" rel="stylesheet" type="text/css" /> </head> <body> <div class="container"> <br/> <div class="panel panel-primary"> <div class="panel-heading"> Add Item </div> <div class="panel-body"> <form method="post" action="{{ route('item.store') }}"> {{csrf_field()}} <div class="form-group"> <label class="col-md-4">Item Name</label> <input type="text" class="form-control" name="name"/> </div> <div class="form-group"> <label class="col-md-4">Item Price</label> <input type="text" class="form-control" name="price"/> </div> <div class="form-group"> <button type="submit" class="btn btn-primary">Add</button> </div> </form> </div> </div> </div> </body> </html>

Now, Change in the ItemController.php file.

public function create() { return view('create'); }

Also, we are going to store the data.

// ItemController.php public function store(Request $request) { $item = new Item; $item->name = $request->get('name'); $item->price = $request->get('price'); $item->save(); return 'Store the data'; }

Next, go to the http://localhost:8000/item and fill the form values and submit the form. It will store the data.

Step 3: Why we want to use Model Observer.

Now, suppose, if we want to make the name into the upper case, but we do not want to write the logic or function in the controller then, we can use the Model Events. It will fire automatically when the new record is created or updated or deleted. There are following types of Model Events available in Laravel Doc

Eloquent models shoot several events, allowing you to hook into the next points in a model’s lifecycle: retrieved , creating , created , updating , updated , saving , saved , deleting , deleted , restoring , restore

We will use the one of above’s event to turn the name letters into the uppercase without writing any logic into the controller file.

Now, go to the app >> Providers >> AppServiceProvider.php file and add the following code.

// AppServiceProvider.php /** * Bootstrap any application services. * * @return void */ public function boot() { \App\Item::creating(function($model){ $model->name = strtoupper($model->name); }); }

Here at the time of creation of the model, we are telling the Laravel that please convert all letters of the name attribute to the capital. So here, we have used the Model Events to complete our task.

We can also create the dedicated class that provides the method and then in that method; we will use the logic to convert the letters.

Step 4: Create Service Provider for the Observers.

Make the service provider for the following command.

php artisan make:provider ItemModelServiceProvider

Register this service provider into the Laravel App. Go to the config >> app.php file. Add the following code.

'providers' => [ App\Providers\ItemModelServiceProvider::class, ];

Now, we can not create the Observer through the command line, so we will create a directory inside the app folder called Observers. In that folder, we need to create the ItemObserver.php file.

<?php namespace App\Observers; use App\Item; class ItemObserver { public function creating(Item $item) { $item->name = strtoupper($item->name); } }

Now, we also need to register this observer inside the ItemModelServiceProvider.php file.

<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; class ItemModelServiceProvider extends ServiceProvider { /** * Bootstrap the application services. * * @return void */ public function boot() { \App\Item::observe(\App\Observers\ItemObserver::class); } /** * Register the application services. * * @return void */ public function register() { // } }

Now, again try to save the data and it works. We can easily see that name is upper case.

So that is how we can use the Model Observers. General use case is may be, when we have cached the data, but when the data is updated, we need to flush the cache and rebuild the cache for the correct data.

Finally, Laravel Model Observers Tutorial With Example is over.