PHP
Centralize Model Event Handling with Eloquent Observers
Learn to use Eloquent observers to centralize and organize code that responds to model lifecycle events like creating, updating, or deleting records.
// app/Providers/AppServiceProvider.php
namespace App\Providers;
use App\Models\User;
use App\Observers\UserObserver;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function boot(): void
{
User::observe(UserObserver::class);
}
}
// app/Observers/UserObserver.php
namespace App\Observers;
use App\Models\User;
class UserObserver
{
public function creating(User $user): void
{
// Set a default value before the user is saved
$user->status = 'pending';
}
public function created(User $user): void
{
// Log creation or send a welcome email
\Log::info("User {$user->id} was created.");
}
public function updating(User $user): void
{
// Perform actions before an update
if ($user->isDirty('email')) {
\Log::info("User {$user->id}'s email is being updated from {$user->getOriginal('email')} to {$user->email}");
}
}
public function deleted(User $user): void
{
// Clean up related data or send notifications
\Log::info("User {$user->id} was deleted.");
}
}
How it works: Eloquent observers provide a centralized location to group event listeners for a model. Instead of defining event callbacks directly within the model or service providers, an observer class contains methods for various model lifecycle events (e.g., `creating`, `created`, `updating`, `updated`, `deleting`, `deleted`). This pattern helps keep your models cleaner and makes event handling logic more organized and reusable. Observers are typically registered in a service provider's `boot` method.