कारण मैं कहता हूं कि लेनदेन मॉडल परत में संबंधित नहीं है मूल रूप से यह है:
मॉडल अन्य मॉडलों में तरीकों कॉल कर सकते हैं।
एक मॉडल एक सौदे शुरू करने के लिए कोशिश करता है, लेकिन इसके बारे में है कि क्या उसके फोन करने वाले पहले से ही एक लेन-देन शुरू कर दिया कोई ज्ञान नहीं है, तो मॉडल के लिए सशर्त एक सौदे, के रूप में @Bubba's answer में कोड उदाहरण में दिखाया गया शुरू किया है। मॉडल के तरीकों को ध्वज स्वीकार करना है ताकि कॉलर इसे बता सके कि उसे अपना लेनदेन शुरू करने की अनुमति है या नहीं। अन्यथा मॉडल में अपने कॉलर के "लेनदेन में" राज्य से पूछताछ करने की क्षमता होनी चाहिए।
public function setPrivacy($privacy, $caller){
if (! $caller->isInTransaction()) $this->beginTransaction();
$this->privacy = $privacy;
// ...action code..
if (! $caller->isInTransaction()) $this->commit();
}
क्या होगा यदि कॉलर कोई ऑब्जेक्ट नहीं है? PHP में, यह एक स्थिर विधि या बस गैर-ऑब्जेक्ट उन्मुख कोड हो सकता है। यह बहुत गन्दा हो जाता है, और मॉडल में बहुत बार दोहराए गए कोड की ओर जाता है।
यह Control Coupling का एक उदाहरण भी है, जिसे बुरा माना जाता है क्योंकि कॉलर को बुलाए गए ऑब्जेक्ट के आंतरिक कार्यों के बारे में कुछ पता होना चाहिए।उदाहरण के लिए, आपके मॉडल के तरीकों के कुछ में $ ट्रांजैक्शनल पैरामीटर हो सकता है, लेकिन अन्य विधियों में वह पैरामीटर नहीं हो सकता है। कॉलर को पता होना चाहिए कि पैरामीटर कब मायने रखता है?
// I need to override method's attempt to commit
$video->setPrivacy($privacy, false);
// But I have no idea if this method might attempt to commit
$video->setFormat($format);
अन्य समाधान मैं सुझाव दिया देखा है (या यहाँ तक प्रोपेल जैसे कुछ चौखटे में लागू) beginTransaction()
और commit()
कोई-ऑप्स बनाने के लिए जब DBAL जानता है कि यह पहले से ही एक लेनदेन में है। लेकिन अगर आपका मॉडल प्रतिबद्ध करने की कोशिश करता है और पाते हैं कि यह वास्तव में प्रतिबद्ध नहीं है तो यह विसंगतियों का कारण बन सकता है। या रोलबैक करने की कोशिश करता है और उस अनुरोध को अनदेखा कर दिया है। मैंने पहले इन विसंगतियों के बारे में लिखा है।
समझौता मैंने सुझाया है कि मॉडल लेनदेन के बारे में नहीं जानते। मॉडल को पता नहीं है कि setPrivacy()
पर इसका अनुरोध कुछ ऐसा करना चाहिए या यह एक बड़ी तस्वीर का हिस्सा है, जो कई मॉडलों को शामिल करने वाली परिवर्तनों की एक और जटिल श्रृंखला है और केवल किया जाना चाहिए यदि ये सभी परिवर्तन सफल होते हैं। लेनदेन का मुद्दा है।
तो अगर मॉडल नहीं जानते कि वे क्या कर सकते हैं या शुरू कर सकते हैं और अपना लेनदेन कर सकते हैं, तो कौन करता है? GRASP में Controller pattern शामिल है जो उपयोग के मामले के लिए एक गैर-UI श्रेणी है, और इसे उस केस केस को पूरा करने के लिए सभी टुकड़ों को बनाने और नियंत्रित करने की ज़िम्मेदारी सौंपी जाती है। नियंत्रकों को लेनदेन के बारे में पता है क्योंकि यह जगह है कि सभी जानकारी इस बात के बारे में सुलभ है कि पूर्ण उपयोग केस जटिल है या नहीं, और एक लेनदेन (या शायद कई लेनदेन के भीतर) में मॉडल में कई बदलाव किए जाने की आवश्यकता है।
उदाहरण मैं के बारे में पहले लिखा है, कि एक MVC नियंत्रक के beforeAction()
विधि में एक सौदे शुरू करने और afterAction()
विधि में यह प्रतिबद्ध करने के लिए, एक सरलीकरण है। नियंत्रक को कई लेनदेन शुरू करने और प्रतिबद्ध करने के लिए स्वतंत्र होना चाहिए क्योंकि इसे वर्तमान कार्रवाई को पूरा करने के लिए तर्कसंगत रूप से आवश्यक है। या कभी-कभी नियंत्रक स्पष्ट लेनदेन नियंत्रण से बचना कर सकता है, और मॉडल को प्रत्येक परिवर्तन को स्वत: सूचित करने की अनुमति देता है।
लेकिन मुद्दा यह है कि क्या ट्रांज़ेक्शन आवश्यक है, इस बारे में जानकारी कुछ है जो मॉडल को नहीं पता - उन्हें बताया जाना चाहिए (एक $ लेनदेन पैरामीटर के रूप में) या फिर इसे से पूछें उनके कॉलर, जिसे कंट्रोलर की कार्रवाई तक वैसे भी सवाल उठाना होगा।
आप कक्षाओं के Service Layer भी बना सकते हैं जो प्रत्येक जानते हैं कि इस तरह के जटिल उपयोग मामलों को कैसे कार्यान्वित किया जाए, और एक ही लेनदेन में सभी परिवर्तनों को संलग्न करना है या नहीं। इस तरह आप बहुत बार दोहराए गए कोड से बचते हैं। लेकिन PHP ऐप्स के लिए एक अलग सेवा परत शामिल करना आम बात नहीं है; नियंत्रक की कार्रवाई आमतौर पर एक सेवा परत के साथ संयोग होता है।
शानदार सवाल। मैं केवल बंद करने के लिए मतदान कर रहा हूं, क्योंकि आम तौर पर इस प्रकार की चर्चा http://codereview.stackexchange.com/ पर बेहतर तरीके से संभाली जाती है, क्योंकि यह प्रदान करने के बजाए "सर्वश्रेष्ठ" के बारे में बहुत सारी खुली-अंत चर्चा को बढ़ावा देती है ठोस, उद्देश्य कोड-आधारित उत्तरों। –
मुझे उस साइट से अवगत नहीं था। मुझे अगली बार इसका इस्तेमाल याद रखना होगा। –