PHP में Domain-Driven Design: अव्यवस्था को कैसे बदलें व्यवस्था में
\n\nक्या आपने कभी महसूस किया है कि आपका PHP प्रोजेक्ट बर्फ के गोले की तरह बढ़ रहा है? शुरुआत में सब कुछ सरल होता है: कुछ कंट्रोलर, एक मॉडल, डेटाबेस से कुछ क्वेरी। लेकिन छह महीने बाद, आप स्पेगेटी कोड में डूब जाते हैं, जहाँ बिज़नेस लॉजिक सर्विसेज में बिखरा होता है, और एक "साधारण" बदलाव में एक हफ्ता लग जाता है।
\n\nपरिचित लगता है? स्वागत है क्लब में। लेकिन एक अच्छी खबर भी है: Domain-Driven Design (DDD) — यह एरिक इवांस की मोटी किताबों का कोई अमूर्त सिद्धांत नहीं है। यह एक काम करने वाला उपकरण है जो वास्तव में PHP कोड लिखने में मदद करता है जो व्यवसाय और डेवलपर्स दोनों के लिए समझने योग्य हो।
\n\nइस लेख में, हम DDD को व्यवहार में समझेंगे। बिना पानी के, PHP पर लाइव उदाहरणों के साथ। आप सीखेंगे कि अपने प्रोजेक्ट में DDD कैसे लागू करें, बिना सिर खपाए और सब कुछ फिर से लिखे। चलिए शुरू करते हैं!
\n\nDomain-Driven Design क्या है और PHP डेवलपर को इसकी आवश्यकता क्यों है?
\n\nकल्पना करें कि आप एक ऑनलाइन स्टोर बना रहे हैं। आपके पास डिस्काउंट, कार्ट, ऑर्डर हैं। बिज़नेस लॉजिक: "डिस्काउंट प्रोमो कोड के साथ संयोजित नहीं होता", "शिपमेंट के बाद ऑर्डर रद्द नहीं किया जा सकता"। यदि आप इस लॉजिक को कंट्रोलर में रखते हैं या ORM मॉडल में फैलाते हैं, तो देर-सबेर आप भ्रमित हो जाएंगे।
\n\nDDD एक दृष्टिकोण है जो बिज़नेस डोमेन (आपके विषय क्षेत्र) को डेवलपमेंट के केंद्र में रखता है। तालिकाओं और SQL क्वेरी के बारे में सोचने के बजाय, आप एंटिटी, वैल्यू और इवेंट के बारे में सोचते हैं।
\n\nPHP के लिए यह विशेष रूप से प्रासंगिक है। भाषा लचीली है, लेकिन स्पष्ट आर्किटेक्चर के बिना प्रोजेक्ट जल्दी "लेगसी" बन जाते हैं। DDD एक ढाँचा देता है जो एक साल बाद भी पढ़ने योग्य रहता है।
\n\nस्ट्रैटेजिक बनाम टैक्टिकल डिज़ाइन
\n\nDDD दो बड़े भागों में बंटा है:
\n- \n
- स्ट्रैटेजिक डिज़ाइन — यह आपके प्रोजेक्ट का नक्शा है। आप सीमित संदर्भ (Bounded Contexts) को चिह्नित करते हैं, सर्वव्यापी भाषा (Ubiquitous Language) बनाते हैं। उदाहरण के लिए, "कैटलॉग" संदर्भ में उत्पाद सिर्फ विशेषताओं का एक सेट है, जबकि "ऑर्डर" संदर्भ में यह कीमत और मात्रा वाली एक इकाई है। \n
- टैक्टिकल डिज़ाइन — ये ईंटें हैं: Entity, Value Object, Aggregate, Repository, Domain Service, Domain Event। हम इन पर ध्यान केंद्रित करेंगे। \n
PHP में टैक्टिकल डिज़ाइन: DDD की ईंटें
\n\nआइए देखें कि PHP पर DDD के मुख्य पैटर्न कैसे दिखते हैं। Laravel या Symfony के ActiveRecord को भूल जाइए — यहाँ हम फ्रेमवर्क से स्वतंत्र एक मॉडल बना रहे हैं।
\n\n1. Entity (एंटिटी)
\nएंटिटी एक ऑब्जेक्ट है जिसका एक अद्वितीय पहचानकर्ता होता है और यह समय के साथ बदलता है। उदाहरण के लिए, User या Order। एंटिटी की तुलना ID से करें, फ़ील्ड से नहीं।
<?php\n\ndeclare(strict_types=1);\n\nnamespace App\\Domain\\Entity;\n\nuse App\\Domain\\ValueObject\\UserId;\nuse App\\Domain\\ValueObject\\Email;\n\nclass User\n{\n public function __construct(\n private UserId $id,\n private string $name,\n private Email $email\n ) {}\n\n public function getId(): UserId\n {\n return $this->id;\n }\n\n public function changeEmail(Email $newEmail): void\n {\n // यहाँ बिज़नेस लॉजिक हो सकता है: जाँच करें कि ईमेल पहले से उपयोग में तो नहीं है\n $this->email = $newEmail;\n }\n\n public function getEmail(): Email\n {\n return $this->email;\n }\n}\n\n\n2. Value Object (वैल्यू ऑब्जेक्ट)
\nValue Object एक अपरिवर्तनीय ऑब्जेक्ट है जो अपने गुणों से परिभाषित होता है, पहचानकर्ता से नहीं। दो Value Object समान होते हैं यदि उनके सभी फ़ील्ड मेल खाते हैं। क्लासिक उदाहरण: Money, Email, Address।
<?php\n\ndeclare(strict_types=1);\n\nnamespace App\\Domain\\ValueObject;\n\nclass Email\n{\n private string $value;\n\n public function __construct(string $value)\n {\n if (!filter_var($value, FILTER_VALIDATE_EMAIL)) {\n throw new \\InvalidArgumentException('Invalid email address');\n }\n $thi