الكود بيشتغل… بس في المكان الغلط! الفرق بين store(), boot(), و Observer في Laravel

⚙️ الكود بيشتغل… بس في المكان الغلط! الفرق بين store(), boot(), و Observer في Laravel

في مشاريع Laravel الكبيرة، من السهل أن تكتب كودًا بسيطًا مثل إرسال إيميل ترحيبي بعد تسجيل مستخدم، وتضعه مباشرة في دالة store().
لكن بعد فترة ستكتشف أن المستخدم قد يُضاف من أماكن متعددة:

  • Admin Panel

  • Seeder

  • Import Job

  • External API

وهنا المشكلة: الكود داخل store() لن يُنفذ إلا عند التسجيل عبر هذا المسار فقط، فتبدأ النسخ المتكررة وتصبح الصيانة صعبة.


🔹 فهم المكان الصحيح للكود

1️⃣ الكود داخل store()

  • يشبه "الواجهة الأمامية للشركة" (front desk).

  • يتعامل فقط مع الـ request الحالي.

  • مناسب للعمليات المتعلقة بالـ request نفسه، مثل التحقق من بيانات النموذج قبل الحفظ.

2️⃣ الكود داخل boot() بالموديل

  • يشبه "قواعد الشركة الداخلية".

  • يُستخدم لوضع أي قواعد عامة تخص الموديل:

    • توليد UUID تلقائي

    • ضبط القيم الافتراضية

    • إرسال إيميل ترحيبي بعد إنشاء المستخدم

3️⃣ الكود في Observer

  • يشبه "أتمتة النظام".

  • يراقب الأحداث على مستوى النظام كله (created, updated, deleted).

  • يضمن تنفيذ الأكشنات التلقائية مهما كان مصدر العملية.

  • مثال: أي مستخدم يُضاف من أي مكان → يتم إرسال إيميل ترحيبي.


🧠 الخلاصة

  • منطق متعلق بالـ request نفسه → store()

  • قواعد عامة للموديل → boot()

  • أفعال تلقائية بعد حدث معين → Observer

المهم ليس أن يعمل الكود فقط، بل أن يعمل في المكان الصحيح لضمان صيانة أفضل ومرونة أكبر في المشروع.