PHP
Leveraging Eloquent Model Events and Observers
Automate tasks and ensure data integrity using Laravel Eloquent model events or dedicated observers to react to model lifecycle actions (creating, updating, deleting).
// app/Models/Product.php
namespace App/Models;
use Illuminate/Database/Eloquent/Model;
class Product extends Model
{
protected $fillable = ['name', 'price', 'slug'];
protected static function booted(): void
{
static::creating(function (Product $product) {
// Generate a slug before creation
$product->slug = \Illuminate\Support\Str::slug($product->name);
});
static::updated(function (Product $product) {
// Log activity on update
\Log::info("Product {$product->id} updated: {$product->name}");
});
}
}
// OR using an Observer:
// app/Observers/ProductObserver.php
namespace App/Observers;
use App/Models/Product;
use Illuminate/Support/Str;
use Log;
class ProductObserver
{
public function creating(Product $product): void
{
$product->slug = Str::slug($product->name);
}
public function updated(Product $product): void
{
Log::info("Product {$product->id} updated by observer: {$product->name}");
}
}
// Registering the observer (e.g., in AppServiceProvider.php's boot method):
// use App/Observers/ProductObserver;
// use App/Models/Product;
// Product::observe(ProductObserver::class);
// Usage example:
$product = Product::create(['name' => 'Awesome Gadget', 'price' => 99.99]);
echo $product->slug; // Output: awesome-gadget
$product->update(['name' => 'Super Gadget']); // Triggers 'updated' event
How it works: Eloquent models fire several events at different points in their lifecycle (e.g., `creating`, `created`, `updating`, `updated`, `deleting`, `deleted`). You can hook into these events directly within the model's `booted` method using static closures, or by creating dedicated 'Observer' classes. Observers centralize event listeners into a single class, making your models cleaner and logic more organized, especially for complex event handling and automation.