Observer و Event Listener در لاراول: کِی از کدوم استفاده کنیم؟
خلاصهٔ کاملتر
اگه یه مدتی با لاراول کار کرده باشی، احتمالاً اسم Observer و Event Listener به گوشت خورده. هر دو در اصل «گوش میدن» که یه چیزی توی اپ اتفاق بیفته و بعد یه کدی رو اجرا میکنن. ولی وقتی اپهای پیچیدهتری میسازی، میفهمی که این دو برای موقعیتهای متفاوتی طراحی شدن.
تفاوت اصلی اینجاست: Observer به مدلهای Eloquent وابستهست و به رویدادهای چرخهی حیات مدل مثل creating، updating یا deleted واکنش نشون میده. Event Listener اما برای رویدادهای سفارشیای که خودت dispatch میکنی طراحی شده؛ مثل وقتی که کاربر ثبتنام میکنه یا یه سفارش ثبت میشه. به زبان ساده: اگه داری به یه اتفاق روی یه مدل واکنش نشون میدی، از Observer استفاده کن. اگه داری به یه رویداد سطح اپلیکیشن جواب میدی، از Event + Listener استفاده کن.
Observer ها عالیان برای اینکه منطق مرتبط با یه مدل خاص رو از کنترلر و خود مدل جدا نگه داری. مثلاً میخوای هر بار که یه پست حذف شد، یه لاگ ثبت بشه. به جای نوشتن این منطق توی کنترلر، میتونی یه PostObserver بسازی و متد deleted رو داخلش تعریف کنی:
public function deleted(Post $post)
{
Log::info("Post '{$post->title}' was deleted by user ID: {$post->user_id}");
}بعد کافیه Observer رو توی AppServiceProvider ثبت کنی:
Post::observe(PostObserver::class);همین! از این به بعد هر بار پستی حذف بشه، اون لاگ بهصورت خودکار ثبت میشه؛ بدون هیچ کد اضافهای توی کنترلر.
Event Listener وقتی به کار میاد که بخوای اپت به یه اتفاق مهم که مستقیماً به چرخهی یه مدل وابسته نیست، جواب بده. فرض کن کاربر ثبتنام کرده و میخوای ایمیل خوشآمدگویی بفرستی، ادمین رو خبر کنی و یه job برای sync با CRM راه بندازی. ریختن همهی اینها توی کنترلر کدت رو به هم میریزه. راهحل تمیزتر اینه که یه رویداد UserRegistered dispatch کنی و برای هر وظیفه یه Listener جداگانه بسازی:
// داخل کنترلر
event(new UserRegistered($user));هر Listener یه مسئولیت مشخص داره، بهراحتی تست میشه و میتونی قرارشون بدی توی queue تا ایمیلها در پسزمینه ارسال بشن.
برای مقایسه سریع: Observer نیازی به dispatch دستی نداره و به چرخهی حیات مدل گره خورده، ولی برای رویدادهای سفارشی اپ مناسب نیست. Event Listener باید دستی dispatch بشه، ولی برای رویدادهای سطح اپلیکیشن و وقتی چند چیز باید در جواب یه اتفاق انجام بشن، ایدهآله.
جالب اینجاست که میتونی این دو رو با هم ترکیب کنی. مثلاً از یه Observer استفاده کن که وقتی یه کاربر جدید ساخته شد، داخلش یه رویداد UserRegistered dispatch کنه. اینجوری هم منطق مدل مرتب میمونه، هم بقیهی کارها بهدرستی از هم جدا میشن.
در نهایت هر دو ابزار برای «واکنش به اتفاقات» طراحی شدن؛ فقط نوع اتفاقیه که تعیین میکنه کدوم رو انتخاب کنی. رویداد سطح مدل؟ Observer. رویداد سطح اپلیکیشن؟ Event + Listener. دونستن این تفاوت کمک میکنه کدت نهفقط تمیزتر، بلکه آسونتر هم گسترش پیدا کنه.
نکات کلیدی:
- Observer به چرخهی حیات مدلهای Eloquent وابستهست و خودکار اجرا میشه
- Event Listener برای رویدادهای سفارشی سطح اپلیکیشن استفاده میشه و باید دستی dispatch بشه
- Observer منطق مرتبط با یه مدل رو متمرکز نگه میداره و کنترلر رو سبک میکنه
- Listener ها قابل queue هستن و برای کارهای پسزمینه مثل ارسال ایمیل ایدهآلان
- میشه Observer و Event Listener رو با هم ترکیب کرد تا هم کد تمیز بمونه هم مسئولیتها جدا باشن




