Laravel Basic | How to use Laravel Model Observers

Raviya Technical
3 min readMar 12, 2022

Hello,

If you need to see the example of laravel observers example. We will use how to use laravel model observers. you can understand a concept of what is observers in laravel. this example will help you laravel model observers.

I will explain to you how to use the laravel model observers event, you can easily use it with laravel 6, laravel 7, laravel 8, and laravel 9 projects.

Laravel Observers are used to group event listeners for a model eloquent. Laravel Observers will listener event for a model eloquent method like create, update and delete.

I will give you a very simple definition and use of laravel observers is, when you need to generate slug or auto-generate unique id or something like logic add before or after creating record then observers will help you. I will give you bellow events provided by observers and simple examples below:

Eloquent Hook

  • Retrieved: after a record has been retrieved.
  • Creating: before a record has been created.
  • Created: after a record has been created.
  • Updating: before a record is updated.
  • Updated: after a record has been updated.
  • Saving: before a record is saved (either created or updated).
  • Saved: after a record has been saved (either created or updated).
  • Deleting: before a record is deleted or soft-deleted.
  • Deleted: after a record has been deleted or soft-deleted.
  • Restoring: before a soft-deleted record is going to be restored.
  • Restored: after a soft-deleted record has been restored.

Example:

Now here we will see a simple example, I have one product model and it has a name, slug, price, and unique_id column. so I need to create one record with the name and price only. but when it’s created I need to generate slug from name and auto-generate unique_id.

so let’s see how to create an observers class and how it will work:

app/Models/Product.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
use HasFactory;

protected $fillable = [
'name', 'price', 'slug', 'unique_id',
];
}

Create observers class for Product. So, create bellow command:

php artisan make:observer ProductObserver --model=Product

app/Observers/ProductObserver.php

<?php

namespace App\Observers;

use App\Models\Product;

class ProductObserver
{
/**
* Handle the Product "created" event.
*
* @return void
*/

public function creating(Product $product)
{
$product->slug = \Str::slug($product->name);
}

/**
* Handle the Product "created" event.
*
* @return void
*/

public function created(Product $product)
{
$product->unique_id = 'PR-'.$product->id;
$product->save();
}

/**
* Handle the Product "updated" event.
*
* @return void
*/

public function updated(Product $product) {}

/**
* Handle the Product "deleted" event.
*
* @return void
*/

public function deleted(Product $product) {}

/**
* Handle the Product "restored" event.
*
* @return void
*/

public function restored(Product $product) {}

/**
* Handle the Product "force deleted" event.
*
* @return void
*/

public function forceDeleted(Product $product) {}
}

Register Observers class on the provider.

app/Providers/EventServiceProvider.php

<?php

namespace App\Providers;

use App\Models\Product;
use App\Observers\ProductObserver;
use Illuminate\Auth\Events\Registered;
use Illuminate\Auth\Listeners\SendEmailVerificationNotification;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Event;

class EventServiceProvider extends ServiceProvider
{
/**
* The event listener mappings for the application.
*
* @var array
*/

protected $listen = [
Registered::class => [
SendEmailVerificationNotification::class,
],
];

/**
* Register any events for your application.
*
* @return void
*/

public function boot()
{
Product::observe(ProductObserver::class);
}
}

Create Demo Route:

routes/web.php

<?php

use App\Http\Controllers\ProductController;
use Illuminate\Support\Facades\Route;

Route::get('product', [ProductController::class, 'index']);

Create Controller Route:

app/Http/Controllers/ProductController.php

<?php

namespace App\Http\Controllers;

use App\Models\Product;

class ProductController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/

public function index()
{
$product = Product::create([
'name' => 'Platinum 1',
'price' => 10,
]);
dd($product);
}
}

now you can run the project and see.

it will create a record as like bellow:

Laravel Basic | How to use Laravel Model Observers

Did you know you can clap multiple times? 🥰 If this story added value to your day, please show your support by giving it a 👏 clap, sharing it with others, or even sponsoring my work. Your appreciation means the world to me!

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

Responses (3)

Write a response

This article should be removed from Medium immediately due to spelling errors, grammatical errors, and general misuse of the English language.

Useful and simple example!

I’d rather say “don’t use observers”. Unless you don’t want to write properly object oriented code, but want to stick to framework’s magic instead.