Bird
Raised Fist0
Laravelframework~10 mins

Model events and observers in Laravel - Step-by-Step Execution

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Concept Flow - Model events and observers
Model Action Triggered
↓
Check for Registered Observer
Yes↓
Call Observer Method
↓
Execute Custom Logic
↓
Continue Model Process
↓
End
When a model action happens, Laravel checks if an observer is registered. If yes, it calls the observer method to run custom code before continuing.
Execution Sample
Laravel
use IlluminateSupportStr;

class UserObserver {
  public function creating(User $user) {
    $user->api_token = Str::random(60);
  }
}

User::observe(UserObserver::class);

User::create(['name' => 'Anna']);
This code sets an API token automatically when a new User is created using an observer.
Execution Table
StepEvent TriggeredObserver Method CalledAction TakenModel State
1User::create() calledNoStart creating userUser instance with name='Anna', api_token=null
2creating eventcreating()Set api_token to random stringUser instance with name='Anna', api_token='random60chars'
3created eventNoUser saved to databaseUser saved with name='Anna', api_token='random60chars'
4EndNoCreation completeUser record exists with api_token
💡 User creation finishes after observer sets api_token during creating event
Variable Tracker
VariableStartAfter Step 1After Step 2After Step 3Final
user->namenullAnnaAnnaAnnaAnna
user->api_tokennullnullrandom60charsrandom60charsrandom60chars
Key Moments - 2 Insights
Why does the api_token get set before the user is saved?
Because the observer's creating() method runs during the 'creating' event, which happens before the model is saved, as shown in execution_table step 2.
What happens if no observer is registered?
The model events still fire, but no custom code runs. The execution_table shows 'No' under Observer Method Called when no observer is registered.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at step 2. What change happens to the user model?
Aapi_token is set to a random string
BUser name is changed to null
CUser is saved to database
DNo changes happen
💡 Hint
Check the 'Action Taken' and 'Model State' columns at step 2 in execution_table
At which step does the user get saved to the database?
AStep 1
BStep 2
CStep 3
DStep 4
💡 Hint
Look for 'User saved to database' in the 'Action Taken' column in execution_table
If the observer's creating() method was removed, what would happen to api_token?
AIt would still be set automatically
BIt would remain null
CUser creation would fail
Dapi_token would be set after saving
💡 Hint
Refer to variable_tracker and execution_table steps where observer sets api_token
Concept Snapshot
Model events fire during model actions like creating or updating.
Observers listen to these events and run custom code.
Register observers with Model::observe(ObserverClass::class).
Observer methods run before or after model actions.
Use observers to keep model logic clean and reusable.
Full Transcript
In Laravel, model events happen during actions like creating or updating a model. Observers are classes that listen to these events and run custom code. For example, when creating a User, the creating event fires before saving. If an observer is registered, its creating() method runs and can modify the model, like setting an api_token. After that, the model saves with the updated data. This process helps keep code organized by separating event logic from controllers or models. The execution table shows each step: starting creation, observer setting api_token, saving the user, and finishing. Variables like user->api_token change during the observer method. If no observer is registered, the model still saves but without custom changes. Observers are registered using User::observe(UserObserver::class). This pattern helps automate tasks during model lifecycle events.

Practice

(1/5)
1. What is the main purpose of model events in Laravel?
easy
A. To react automatically when a model is created, updated, or deleted
B. To define database table relationships
C. To create database migrations
D. To write raw SQL queries

Solution

  1. Step 1: Understand model events

    Model events are hooks that trigger when a model changes, like creation or deletion.
  2. Step 2: Identify their purpose

    They let you run code automatically on these changes, such as logging or notifications.
  3. Final Answer:

    To react automatically when a model is created, updated, or deleted -> Option A
  4. Quick Check:

    Model events = react on model changes [OK]
Hint: Model events trigger on data changes automatically [OK]
Common Mistakes:
  • Confusing events with database migrations
  • Thinking events define relationships
  • Assuming events run SQL queries directly
2. Which of the following is the correct way to register an observer for a model in Laravel?
easy
A. User::addObserver('UserObserver');
B. User::observe(UserObserver::class);
C. User::registerObserver(UserObserver);
D. User::attachObserver(UserObserver::class);

Solution

  1. Step 1: Recall observer registration syntax

    Laravel uses the static method observe() on the model to register observers.
  2. Step 2: Match correct syntax

    The correct syntax is Model::observe(ObserverClass::class); which matches User::observe(UserObserver::class);.
  3. Final Answer:

    User::observe(UserObserver::class); -> Option B
  4. Quick Check:

    Register observer = observe() method [OK]
Hint: Use observe() method with ::class for observers [OK]
Common Mistakes:
  • Using wrong method names like registerObserver
  • Passing observer as string instead of ::class
  • Confusing attachObserver with observe
3. Given this observer method in Laravel:
public function created(User $user) {
    Log::info('User created: ' . $user->id);
}

What happens when a new User model is saved?
medium
A. An error is thrown because created() is invalid
B. The user is deleted immediately
C. Nothing happens automatically
D. A log entry with the new user's ID is created

Solution

  1. Step 1: Understand the created() observer method

    The created() method runs after a model is saved for the first time.
  2. Step 2: Analyze the method body

    It logs info with the new user's ID, so a log entry is made.
  3. Final Answer:

    A log entry with the new user's ID is created -> Option D
  4. Quick Check:

    created() logs user ID after save [OK]
Hint: created() runs after first save, logs info [OK]
Common Mistakes:
  • Thinking created() deletes the model
  • Assuming created() does nothing
  • Confusing created() with invalid method
4. What is wrong with this observer registration code?
public function boot() {
    User::observe();
}
medium
A. The observe() method is called without passing the observer class
B. The boot() method should be named bootObserver()
C. User model cannot have observers
D. The observe() method should be called on the observer class

Solution

  1. Step 1: Check observe() method usage

    observe() requires the observer class as an argument to register it.
  2. Step 2: Identify missing argument

    Here, observe() is called with no arguments, so it will cause an error.
  3. Final Answer:

    The observe() method is called without passing the observer class -> Option A
  4. Quick Check:

    observe() needs observer class argument [OK]
Hint: Always pass observer class to observe() [OK]
Common Mistakes:
  • Calling observe() without arguments
  • Renaming boot() incorrectly
  • Calling observe() on wrong class
5. You want to log a message every time a Post model is updated, but only if the title has changed. How should you implement this in a PostObserver?
hard
A. Use the deleted(Post $post) method and check if $post->isDirty('title') is true
B. Use the saving(Post $post) method and check if $post->wasChanged('title') is true
C. Use the updated(Post $post) method and check if $post->wasChanged('title') is true
D. Use the created(Post $post) method and check if $post->title is not empty

Solution

  1. Step 1: Identify correct event for update

    The updated() method runs after a model is updated, suitable for this task.
  2. Step 2: Check how to detect changed attributes

    wasChanged('title') returns true if the title attribute was changed during the update.
  3. Step 3: Combine logic

    Inside updated(), check wasChanged('title') to log only when title changed.
  4. Final Answer:

    Use the updated(Post $post) method and check if $post->wasChanged('title') is true -> Option C
  5. Quick Check:

    updated() + wasChanged('title') detects title changes [OK]
Hint: Use updated() and wasChanged() to detect attribute changes [OK]
Common Mistakes:
  • Using created() or deleted() for updates
  • Using wasChanged() inside saving() which runs before update
  • Checking isDirty() in deleted() event