labZero:~$ cd ./notes / note-eloquent-god-model
في أي لحظة تحوّل الـ Eloquent Model إلى God Object — ولم ألاحظ؟
نموذج Order وصل إلى 43 method بين scopes وbusiness logic وhelpers — حين حاولت كتابة اختبار وحدة وجدت أنه غير قابل للعزل.
في مشروع نظام طلبات عمل عليه ثمانية أشهر، فتحت ملف 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 وأقول «هنا منطقية». الإشارة الأولى التي أرصدها الآن: حين يصعب اختبار دالة دون تهيئة نصف التطبيق، الدالة في المكان الخطأ.