VeldoraDocs

23. Model Observers & Lifecycle Hooks

Model Observers group lifecycle event listeners for an ActiveRecord model into a dedicated class. Instead of scattering event callbacks across models or controllers, observers encapsulate model-driven business logic such as sending welcome emails, dispatching jobs, clearing caches, or generating slugs.

Generating an Observer

Use the CLI generator to scaffold an observer class:

Terminal • bash
php veldora make:observer UserObserver --model=User

This creates app/Observers/UserObserver.php:

example.php
PHP
namespace App\Observers;

use App\Models\User;

class UserObserver
{
    public function creating(User $user): void
    {
        // Executed before a new record is inserted
    }

    public function created(User $user): void
    {
        // Executed after a new record is inserted
    }

    public function updating(User $user): void
    {
        // Executed before an existing record is updated
    }

    public function updated(User $user): void
    {
        // Executed after an existing record is updated
    }

    public function saving(User $user): void
    {
        // Executed before insert or update
    }

    public function saved(User $user): void
    {
        // Executed after insert or update
    }

    public function deleting(User $user): void
    {
        // Executed before record is deleted
    }

    public function deleted(User $user): void
    {
        // Executed after record is deleted
    }

    public function restoring(User $user): void
    {
        // Executed before a soft-deleted record is restored
    }

    public function restored(User $user): void
    {
        // Executed after a soft-deleted record is restored
    }

    public function forceDeleted(User $user): void
    {
        // Executed after record is permanently deleted
    }
}

Registering Observers

Register an observer using Model::observe(), typically in your application bootstrap (bootstrap/app.php) or a Service Provider:

example.php
PHP
use App\Models\User;
use App\Observers\UserObserver;

// Pass class-string (instantiated automatically)
User::observe(UserObserver::class);

// Or pass an existing instance
User::observe(new UserObserver());

Supported Lifecycle Events

Event HookWhen It Fires
creatingBefore a new record is inserted into the database
createdAfter a new record has been inserted
updatingBefore an existing record is updated
updatedAfter an existing record has been updated
savingBefore a record is saved (both new and updated)
savedAfter a record has been saved (both new and updated)
deletingBefore a record is deleted from the database
deletedAfter a record has been deleted
restoringBefore a soft-deleted record is restored
restoredAfter a soft-deleted record has been restored
forceDeletedAfter a record is permanently removed from the database
Returning false from a creating, updating, saving, or deleting observer method will cancel the database operation immediately.

Building with AI Assistants?
Copy the Veldora AI Developer Prompt to teach ChatGPT, Claude, Cursor, or Gemini all framework APIs for error-free coding.