Laravel 8 Observers Tutorial with Example

    By: Thad Mertz
    2 years ago

    In this guide we will see how laravel 8 observers work with example. this example will help you understand how to use laravel 8 model observers. I would use easiest approach to show you how to use observers in laravel 8. Creating a basic example of laravel 8 events and observers.

    Laravel Observers are used to group event listeners for a model eloquent. Observers listen to events of model like create, update and delete.

    When you need to generate slug or auto generate unique id or something like logic add before or after create record then observers can be helpful.


    • 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.

    Here i have a example, One product model where it has name, slug, price and id columns. Now i need to create a record with name and price only. when i create this record i want that slug and id generates automatically. So i will use observer class.

    <?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', 'id'
    
        ];
    }
    

    Create observers class for Product.

    <?php
    
      
    
    namespace 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->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)
    
        {
              
        }
    
    }
    

    Time to register Observers class on provider. "app/Providers/EventServiceProvider.php".

    <?php
    
    namespace 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);
        }
    }
    

    Need a Demo Route:

    //routes/web.php
    
    Route::get('product', [ProductController::class, 'index']);
    
    // Create Controller Route:
    
    app/Http/Controllers/ProductController.php
    
    <?php
    
    namespace 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' => 'Ps5 Console',
                'price' => 1000
            ]);
    
            dd($product);
        }
    }
    


    Now it will store slug like "ps5-console". when we run project and create record.