Laravel’s event system is one of its most elegant features—allowing you to decouple logic, improve code readability, and respond to application behaviour in real time. But too often, developers wire up listeners and forget to verify if they’re actually working. In this post, we’ll walk through how to properly register, test, and troubleshoot event listeners in Laravel 12.
🎯 Why Use Events and Listeners?
Events are perfect for handling side effects. Whether you’re sending a welcome email after user registration or logging activity when a post is updated, listeners help keep your core logic clean and focused.
Benefits:
- Separation of concerns
- Easy testing and debugging
- Reusable and scalable architecture
⚙️ Setting Up Events and Listeners
Let’s say you want to fire an event when a new user registers.
1. Create the Event
php artisan make:event UserRegistered
// app/Events/UserRegistered.php
class UserRegistered
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public function __construct(public User $user) {}
}
2. Create the Listener
php artisan make:listener SendWelcomeEmail --event=UserRegistered
// app/Listeners/SendWelcomeEmail.php
class SendWelcomeEmail
{
public function handle(UserRegistered $event)
{
Mail::to($event->user->email)->send(new WelcomeMail($event->user));
}
}
3. Register the Listener
Laravel uses the EventServiceProvider to map events to listeners.
// app/Providers/EventServiceProvider.php
protected $listen = [
UserRegistered::class => [
SendWelcomeEmail::class,
],
];
✅ Make Sure Your Listeners Are Wired Up
Here’s where many developers slip: they write the listener, register it, and assume it works. But Laravel won’t throw an error if your listener isn’t triggered—it’ll silently fail.
🔍 Quick Checklist
- [x] Is the event dispatched?
- [x] Is the listener registered in
EventServiceProvider? - [x] Is the listener’s
handle()method correctly implemented? - [x] Are there any exceptions being swallowed silently?
🧪 How to Test It
You can manually dispatch the event in a controller or service:
event(new UserRegistered($user));
Or write a test:
public function test_listener_is_triggered()
{
Event::fake();
$user = User::factory()->create();
event(new UserRegistered($user));
Event::assertDispatched(UserRegistered::class);
}
🧯 Troubleshooting Tips
- Use
Log::info()inside your listener to confirm execution. - Check for typos in class names or namespaces.
- Ensure your listener class is autoloaded (run
composer dump-autoloadif needed). - If using queued listeners, verify your queue worker is running.
🧠 Pro Tip: Use Discovery Mode
Laravel 12 supports automatic event discovery. If your listeners follow naming conventions and are in the correct directory, Laravel can auto-register them.
// app/Providers/EventServiceProvider.php
public function shouldDiscoverEvents()
{
return true;
}
But be cautious—explicit registration is often clearer and easier to debug.
🚀 Final Thoughts
Event listeners are powerful, but only if they’re properly wired up. Don’t let silent failures derail your app’s behavior. Take a few extra minutes to test and verify your listeners—your future self will thank you.
Fuel my creative spark with a virtual coffee! Your support keeps the ideas percolating—grab me a cup at Buy Me a Coffee and let’s keep the magic brewing!
