मैं मानने जा रहा हूं कि आपको दृढ़ता के लिए सत्यापन की आवश्यकता है।
न केवल देखें, बल्कि मॉडल को सत्यापन भी नहीं करना चाहिए। आईटी में मेरे दिनों के दौरान मुझे एहसास हुआ कि DDD यह सुनिश्चित करने का एक तरीका है कि आप वास्तव में चीजों को सही तरीके से कर रहे हैं, यानी। कक्षाएं वास्तव में वे क्या होना चाहिए के लिए जिम्मेदार हैं।
Domain-Driven डिज़ाइन का पालन करते समय, आपके मॉडल में आपके व्यावसायिक तर्क शामिल होते हैं, और वह यह है। लेकिन उनमें सत्यापन शामिल नहीं है, क्यों नहीं?
मान लेते हैं कि आप पहले से ही अपने डोमेन परत को बनाए रखने के Data Mapperबजाय इसका उपयोग कर रहे हैं Active Record। लेकिन फिर भी, आप मॉडल को मान्य करना चाहते हैं, इसलिए आप अपने मॉडल में सत्यापन जोड़ते हैं।
interface Validation
{
public function validate();
}
class ConcreteModel extends MyModel implements Validation
{
public function validate() { // the validation logic goes here }
}
सत्यापन तर्क सुनिश्चित करता है, आप अपने MySQL डेटाबेस में मॉडल को सही ढंग से सम्मिलित कर सकते हैं ... कुछ महीने गुजरते हैं और आप तय करते हैं, आप अपने मॉडल को noSQL डेटाबेस में भी संग्रहीत करना चाहते हैं, डेटाबेस, जिन्हें MySQL से भिन्न सत्यापन नियमों की आवश्यकता होती है।
लेकिन आपको एक समस्या है, आपके पास केवल 1 सत्यापन विधि है, लेकिन Model2 अलग-अलग तरीकों से मान्य करने की आवश्यकता है।
मॉडल को वही करना चाहिए जो वे करने के लिए जिम्मेदार हैं , उन्हें आपके व्यवसाय तर्क का ध्यान रखना चाहिए और इसे अच्छी तरह से करना चाहिए। सत्यापन हठ से बंधा है, न कि व्यापारिक तर्क से, इसलिए मान्यता एक मॉडल से संबंधित नहीं है ।
आपको Validatorइसके बजाय s बनाना चाहिए , जो उनके निर्माता में एक पैरामीटर के रूप में मान्य करने के लिए एक मॉडल लेगा, Validationइंटरफ़ेस को लागू करेगा और Validatorअपनी वस्तुओं को मान्य करने के लिए इन s का उपयोग करेगा ।
interface Validation
{
public function validate();
}
class MySQLConcreteModelValidator implements Validation
{
public function __construct(ConcreteModel $model) { }
public function validate()
{
// you validate your model here
}
}
class RedisConcreteModelValidator implements Validation
{
public function __construct(ConcreteModel $model) { }
public function validate()
{
// you validate your model with different set of rules here
}
}
यदि भविष्य में किसी भी समय आप एक और दृढ़ता परत के लिए एक और सत्यापन विधि जोड़ना चाहते हैं (क्योंकि आपने फैसला किया है कि Redis और MySQL अब और जाने का रास्ता नहीं है), तो आप बस एक Validatorऔर निर्माण करेंगे और अपने IoCकंटेनर का उपयोग करके सही उदाहरण प्राप्त करेंगे अपने पर config।