الاول لو عاوز تعرف الفرق بين
خش هناا
1 البداية: المشكلة القديمة
في الأول، الكود كان كله Mixed بين الدومين والداتا.
مثال: كود Controller بيعمل حاجتين مع بعض:
يحسب قواعد البزنس (Business Rules) زيtotal priceأوquantity
ويعمل SQL مباشرة ويخزن في قاعدة البيانات
ده غلط لأنه
Core code: اللي بيعبر عن الدومين (Business Logic)
Infrastructure code: اللي بيتعامل مع الداتابيز أو أي نظام خارجي
لما الكود كله متخلط، يبقى صعب نفهمه، صعب نعمل عليه Unit Test، وصعب نغير أي حاجة من غير ما نكسر حاجات تانية.
2 كمل المقدمة من هنا
-----------------------------------------------------------------------------------------
3 الخطوة الأولى: Table Gateway
إدخال Table Gateway
ده حل وسط بين الكود القديم والفصل الحقيقي،
بحيث:
الكود لسه مربوط بالداتا
بس حاولنا نفصل شوية عن الدومين
يعني
فصلنا الـ DB access من الـ Controller
لسه فيه coupling مع DB
لسه الكود مرتبط بـ PDO أو ORM
يعني المشكلة: الكود لسه مربوط بـ relational DB وده مش مثالي.
-----------------------------------------------------------------------------------------
الحل الحقيقي: Entity + Repository + Value Object
4 بعد كده استخدمنا Entity و Repository
الـ Entity بس بتحكي حكاية البزنس
Rules + Behavior + Invariants جوه الكائن
مفيش أي ذكر لـ DB أو ORM
يمكن تعمل new Order(...) من غير DB5 Repository Interface
مجرد واجهة (Interface) مفيهاش DB أو Framework، بس بتحدد طرق التعامل مع Entity، زيsave()أوgetById().
Interface = مجرد Abstract
أي كود Client يتعامل مع Repository مش مع DB مباشرة
يسمح لنا نفصل Core عن Infrastructure
EntityManagerInterface = Doctrine ORMCore code (Entity) مش مربوط بالـ DB، بيشتغل لوحده
6 Repository Implementation
هو اللي بيتعامل فعليًا مع DB أو أي نظام خارجي، بيطبق الواجهة.
الـ Repository بيعمل كل حاجة مرتبطة بـ DB
👈 الـ Entity مش عارف حاجة عن DB
👈لو غيرت DB → تعدّل Repository بس
الدومين = Safe & Testable
7 Value Object للـ ID
الـ OrderId بيغلف الـ IDبيخلي الـ Entity ما تهتمش بالداتابيز
أي تغيير في طريقة التخزين = ما يلمسش الدومين
علشان الكائن يبقى متكامل ومايحصلش مشاكل لو اتكرر ID
علشان الكائن يشتغل Consistently حتى من غير DB
كائن نفسه مسؤول عن حماية الهوية، مش DB أو Repository
8 الفرق بين Active Record و Data Mapper في كود واحد

ليه Data Mapper أفضل للـ Domain Model؟
Core مفصول عن Infrastructure
Unit Testing حقيقي بدون DB
الدومين يحمي نفسه
أي تغييرات في ORM أو DB = Repository بس بيتعدل