Laravel में Events & Listeners — एक परिचय
Laravel की इवेंट-सिस्टम एक Observer पैटर्न की तरह काम करती है: आप “कुछ घटना हुई” यह घोषित करते हैं (event dispatch), और एक या अधिक listeners उस घटना (event) को सुनते हैं और प्रतिक्रिया देते हैं। इससे आप अपने कोड को loosely coupled रख सकते हैं — मतलब, event को trigger करने वाला कोड और उस पर प्रतिक्रिया देने वाला कोड अलग-अलग हो सकते हैं।
Laravel डॉक्यूमेंटेशन के अनुसार:
Event क्लासेस सामान्यतः app/Events फ़ोल्डर में होती हैं।
Listener क्लासेस app/Listeners में होती हैं।
Laravel एक event को कई listeners से जोड़ सकता है।
Queued listeners का उपयोग तब किया जाता है जब listener में समय लेने वाला ऑपरेशन हो (जैसे emailing)।
Events & Listeners कैसे बनाएं — Step by Step
नीचे एक उदाहरण देते हैं जिसमें हम “UserRegistered” नामक event बनाएँगे, और एक listener “SendWelcomeEmail” बनाएँगे ताकि user registration पर welcome email भेजा जाए।
1. Event बनाना
Artisan कमांड का उपयोग करें:
php artisan make:event UserRegistered
इससे एक नई class बनेगी, उदाहरण स्वरूप:
namespace App\Events;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class UserRegistered
{
use Dispatchable, SerializesModels;
public $user;
public function __construct($user)
{
$this->user = $user;
}
}
यह एजेंट केवल data (user) को carry करती है, logic नहीं रखती।
2. Listener बनाना
अब हम listener बनाएँगे:
php artisan make:listener SendWelcomeEmail --event=UserRegistered
इससे एक listener क्लास बनेगी:
namespace App\Listeners;
use App\Events\UserRegistered;
use Illuminate\Contracts\Queue\ShouldQueue; // यदि queue करें
use Illuminate\Queue\InteractsWithQueue;
class SendWelcomeEmail implements ShouldQueue // optional: ShouldQueue
{
use InteractsWithQueue;
public function __construct()
{
//
}
public function handle(UserRegistered $event)
{
$user = $event->user;
// यहाँ आपका logic — e.g. email भेजना
\Mail::to($user->email)->send(new \App\Mail\WelcomeMail($user));
}
}
अगर आप ShouldQueue interface उपयोग करते हैं, तो यह listener queue में चलेगा, न कि तुरंत (synchronous) execution होगा।
3. Listener को register करना
app/Providers/EventServiceProvider.php फाइल में:
protected $listen = [
\App\Events\UserRegistered::class => [
\App\Listeners\SendWelcomeEmail::class,
],
];
Laravel नए संस्करणों में auto-discovery feature रखता है, जो listeners को app/Listeners directory में automatically खोज लेता है।
4. Event dispatch करना
जब user register हो जाए — उदाहरण स्वरूप controller में — आप इस तरह event dispatch कर सकते हैं:
event(new \App\Events\UserRegistered($user));
या Laravel helper function:
UserRegistered::dispatch($user);
इस प्रकार, आपका listener SendWelcomeEmail उस event को सुनेगा और email भेजेगा।
Advanced Concepts & Best Practices
● Event Subscribers
यदि एक listener क्लास को 여러 events संभालनी हों, तो आप Event Subscriber बना सकते हैं। इसमें एक subscribe() method होती है, जहाँ आप कई events को एक साथ register कर सकते हैं।
● Stopping Propagation
अगर आप चाहते हैं कि एक event listener दूसरे listener को block करे, तो listener के handle() method में return false; कर सकते हैं।
● Failure Handling & Retry
Queued listeners में failure हो सकती है। Laravel में यदि attempts exceed हो जाएँ, तो failed() method को override किया जा सकता है।
● Encryption for Queued Listeners
आप चाहें तो queued listener data को encrypt भी कर सकते हैं, ShouldBeEncrypted interface लागू कर के।
● Decoupling & Maintainability
Events & Listeners का बड़ा फायदा यह है कि आप नए functionality (जैसे नयी email, logs, analytics) जोड़ सकते हैं बिना existing code को touch किए। Reddit पर एक user लिखते हैं:
“Instead of coupling your order processing code to your Slack notification code, you can raise an OrderShipped event …”
दूसरा user कहता है:
“One listener to one event can be replaced … but events become useful when you register multiple listeners to the same event.”
हिंदी में संक्षिप्त सारांश
Event = एक घटना (action) जो application में होती है (जैसे user registration)
Listener = वह handler जो उस घटना पर प्रतिक्रिया देता है (जैसे email भेजना)
आप एक event पर कई listeners attach कर सकते हैं
Queued listeners धीमी tasks के लिए उपयोगी हैं
Subscriber, propagation control, failure handling जैसे advanced फीचर्स उपलब्ध है