Laravel Basic | How to use Laravel Model Observers
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:
I hope it can help you…