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
Model Events and Observers in Laravel
📖 Scenario: You are building a Laravel application to manage a list of books. You want to automatically log a message whenever a book is created in the database.
🎯 Goal: Create a Laravel model called Book and an observer called BookObserver. Set up the observer to listen for the created event on the Book model and log a message when a new book is added.
📋 What You'll Learn
Create a Book model
Create a BookObserver class
Register the observer in the AppServiceProvider
Implement the created method in the observer to log a message
💡 Why This Matters
🌍 Real World
Model events and observers help automate tasks like logging, notifications, or data cleanup when database records change.
💼 Career
Understanding Laravel model events and observers is essential for backend developers to write clean, maintainable, and reactive applications.
Progress0 / 4 steps
1
Create the Book model
Create a Laravel model called Book using the php artisan make:model Book command or by creating a class Book that extends Illuminate\Database\Eloquent\Model.
Laravel
Hint
The model class should be in the App\Models namespace and extend Model.
2
Create the BookObserver class
Create an observer class called BookObserver in the App\Observers namespace. Add a public method created that accepts a Book instance as a parameter.
Laravel
Hint
The observer class should have a created method that receives a Book object and logs a message.
3
Register the observer in AppServiceProvider
In the App\Providers\AppServiceProvider class, import Book and BookObserver. In the boot method, register the observer by calling Book::observe(BookObserver::class);.
Laravel
Hint
Make sure to import both Book and BookObserver classes and call observe inside the boot method.
4
Test the observer by creating a Book instance
Add code to create a new Book instance with title set to 'Laravel Basics' and save it to the database. This will trigger the created event and log the message.
Laravel
Hint
Create a new Book object, set the title property, and call save() to trigger the observer.
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
Step 1: Understand model events
Model events are hooks that trigger when a model changes, like creation or deletion.
Step 2: Identify their purpose
They let you run code automatically on these changes, such as logging or notifications.
Final Answer:
To react automatically when a model is created, updated, or deleted -> Option A
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
Step 1: Recall observer registration syntax
Laravel uses the static method observe() on the model to register observers.
Step 2: Match correct syntax
The correct syntax is Model::observe(ObserverClass::class); which matches User::observe(UserObserver::class);.
Final Answer:
User::observe(UserObserver::class); -> Option B
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
Step 1: Understand the created() observer method
The created() method runs after a model is saved for the first time.
Step 2: Analyze the method body
It logs info with the new user's ID, so a log entry is made.
Final Answer:
A log entry with the new user's ID is created -> Option D
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
Step 1: Check observe() method usage
observe() requires the observer class as an argument to register it.
Step 2: Identify missing argument
Here, observe() is called with no arguments, so it will cause an error.
Final Answer:
The observe() method is called without passing the observer class -> Option A
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
Step 1: Identify correct event for update
The updated() method runs after a model is updated, suitable for this task.
Step 2: Check how to detect changed attributes
wasChanged('title') returns true if the title attribute was changed during the update.
Step 3: Combine logic
Inside updated(), check wasChanged('title') to log only when title changed.
Final Answer:
Use the updated(Post $post) method and check if $post->wasChanged('title') is true -> Option C
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