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

<?phpnamespace 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

<?phpnamespace App\Observers;use App\Models\Product;class ProductObserver{/*** Handle the Product "created" event.** @param  \App\Models\Product  $product* @return void*/public function creating(Product $product){$product->slug = \Str::slug($product->name);}/*** Handle the Product "created" event.** @param  \App\Models\Product  $product* @return void*/public function created(Product $product){$product->unique_id = 'PR-'.$product->id;$product->save();}/*** Handle the Product "updated" event.** @param  \App\Models\Product  $product* @return void*/public function updated(Product $product){}/*** Handle the Product "deleted" event.** @param  \App\Models\Product  $product* @return void*/public function deleted(Product $product){}/*** Handle the Product "restored" event.** @param  \App\Models\Product  $product* @return void*/public function restored(Product $product){}/*** Handle the Product "force deleted" event.** @param  \App\Models\Product  $product* @return void*/public function forceDeleted(Product $product){}}

Register Observers class on the provider.

app/Providers/EventServiceProvider.php

<?phpnamespace App\Providers;use Illuminate\Auth\Events\Registered;use Illuminate\Auth\Listeners\SendEmailVerificationNotification;use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;use Illuminate\Support\Facades\Event;use App\Observers\ProductObserver;use App\Models\Product;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

<?phpuse Illuminate\Support\Facades\Route;use App\Http\Controllers\ProductController;
Route::get('product', [ProductController::class, 'index']);

Create Controller Route:

app/Http/Controllers/ProductController.php

<?phpnamespace App\Http\Controllers;use App\Models\Product;use Illuminate\Http\Request;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

I hope it can help you…

--

--