labZero:~$ cd ./notes / note-eloquent-god-model

الملاحظات
نسخة صفر 4 يونيو 2026

في أي لحظة تحوّل الـ Eloquent Model إلى God Object — ولم ألاحظ؟

نموذج Order وصل إلى 43 method بين scopes وbusiness logic وhelpers — حين حاولت كتابة اختبار وحدة وجدت أنه غير قابل للعزل.

#Laravel #Architecture #Eloquent

في مشروع نظام طلبات عمل عليه ثمانية أشهر، فتحت ملف Order.php ذات يوم لإضافة scope بسيطة فوجدت 650 سطراً. الملف فيه: 12 scope، 8 relationship، 6 mutator، 4 event، وأكثر من 10 method تجارية مثل processPayment(), sendConfirmation(), calculateTax(), notifyWarehouse(). كل إضافة كانت منطقية في وقتها، لكن الناتج النهائي كان model يعرف كل شيء — المحاسبة والإشعارات والمخزون والتسعير.

الجوهر: المشكلة لم تظهر في الكود نفسه — الكود كان يعمل. ظهرت عندما حاولت كتابة unit test لـ calculateTax(). الدالة كانت تستدعي $this->customer->address->country, $this->items()->withTax()->get(), وTaxService::lookup() في نفس المسار. لا يمكن اختبارها دون قاعدة بيانات كاملة وخدمات حقيقية. النموذج صار يُختبر integration-style حتى لأبسط منطق.

استخرجت ثلاث classes: OrderPricing للحسابات المالية، OrderFulfillment لتنسيق الحالة والإشعارات، OrderQueries لكل scopes معقدة تحتاج joins. أبقيت في Model فقط: relationships، simple scopes، casts، وaccess methods.

// بدل $order->calculateTax()
$pricing = new OrderPricing($order);
$tax = $pricing->calculateTax();

ما أتذكره الآن: God Object لا يُولد في يوم — يُبنى قرار صغير في كل مرة أضيف method وأقول «هنا منطقية». الإشارة الأولى التي أرصدها الآن: حين يصعب اختبار دالة دون تهيئة نصف التطبيق، الدالة في المكان الخطأ.

لديك مشكلة مشابهة؟

إذا واجهت موقفًا قريبًا من هذا في مشروعك، يمكننا الحديث عنه.

لنتحدّث عنها