Magento 2: अपरिवर्तनीय स्थिति के साथ डेटा ऑब्जेक्ट बनाना?


9

एक और मैगनेटो 2 में एक टिप्पणी को दोहराते हुए

यदि आपको कुछ गणना मूल्य साझा करने की आवश्यकता है, तो गणना व्यवहार को अलग ऑब्जेक्ट पर रखें और इसे उन ब्लॉकों से कॉल करें जिन्हें उस मूल्य की आवश्यकता होती है। रजिस्ट्री को हतोत्साहित किया जाता है क्योंकि यह वैश्विक परिवर्तनशील स्थिति है और आप कभी भी निश्चित नहीं हैं कि आपको वहां से क्या मिलेगा।

क्या Magento 2 में एक वस्तु बनाने का एक तरीका है अपरिवर्तनीय स्थिति के साथ? रजिस्ट्री का उपयोग करना ( Magento\Framework\Registry) इसलिए हतोत्साहित किया जाता है क्योंकि यह वैश्विक परिवर्तनशील स्थिति है (क्योंकि, क्योंकि registerविधि आपको मौजूदा कुंजी को बदलने की अनुमति नहीं देती है, आप परेशान हो सकते हैं और फिर उस कुंजी को रीसेट कर सकते हैं )।

हालाँकि - Magento में किसी भी वस्तु के लिए एक ही समस्या मौजूद है। 2. अगर मैं एक ऑब्जेक्ट बनाने के लिए था

namespace Pulsestorm\Helloworld\Model;
use Magento\Framework\DataObject;

class ViewVars extends DataObject
{
}

फिर स्वचालित कंस्ट्रक्टर निर्भरता इंजेक्शन सुनिश्चित करता है कि कोई भी उस साझा वस्तु को हड़प सके। यदि ऑब्जेक्ट अनसेंडेड है, तो व्यू / ब्लॉक इसे हड़प नहीं सकता है।

सिद्धांत रूप में, हम कुछ ऐसा कर सकते थे

namespace Pulsestorm\Helloworld\Model;

class ViewVars
{
    protected $_data=false;
    protected function setData($data)
    {
        if($_data)
        {
            throw new Exception("Immutable");
        }
        $this->_data = $data;
    }

    public function getData()
    {
        return $this->_data;
    }
}

लेकिन यह एक कार्य के लिए बहुत सारे काम की तरह लगता है जैसे कि एक दृश्य के लिए अलग-अलग चर निर्धारित करना । क्या मैगेंटो 2 में एक बेहतर तरीका है कि मैं अपरिवर्तनीय डेटा ऑब्जेक्ट नहीं बना सकता हूं, जिसके बारे में मुझे जानकारी नहीं है?


क्या पुराना मग रजिस्ट्री पैटर्न मूल्य को अपरिवर्तनीय बनाने का प्रयास नहीं करता है? IMHO यह एक लंग निर्माण होना चाहिए। एम 2 एचएचवीएम के साथ संगत है इसलिए यदि आपको इस निर्माण की सख्त आवश्यकता है तो आप हैक को अपना सकते हैं, जो अपरिवर्तनीय डेटा प्रकार प्रदान करता है। स्पष्ट रूप से यह दोनों ही घोसले में कहा गया है और मेरे सिर के साथ-साथ इस तरफ इशारा किया गया है जैसे कि यह इशारा करना है कि यह वास्तव में एक बात हो सकती है।
५५ पर फिलिंक करें

1
मुझे लगता है कि एंटोन की टिप्पणी का मुद्दा यह था कि यदि आप एक रजिस्ट्री इंटरफ़ेस का उपयोग कर रहे हैं, तो इस बारे में कोई गारंटी नहीं है कि आप वास्तव में क्या कर रहे हैं। आप कह सकते हैं, 'ठीक है, मैं रजिस्ट्री कुंजी current_model में \ My \ Model को यहाँ संग्रहीत करने जा रहा हूँ, और आवश्यकतानुसार उपयोग करें'। लेकिन (1) कुछ भी गारंटी नहीं देता है कि current_model \ My \ मॉडल (या कुछ भी) का एक उदाहरण है; और (2) निष्पादन मार्ग में कहीं भी कोई भी कोड किसी भी तरह से उस रजिस्ट्री कुंजी का उपयोग या संशोधित कर सकता है। जिससे बड़ी समस्या पैदा हो सकती है। उस राज्य डेटा को बनाए रखने के लिए निर्भरता इंजेक्शन के साथ एक परिभाषित इंटरफ़ेस और सिंगलटन का उपयोग करना बेहतर है।
रयान होएर

बस्तियों के साथ वस्तु अपरिवर्तनीय नहीं है। ऑब्जेक्ट में डेटा सेट करने के लिए कंस्ट्रक्टर का उपयोग करें।
कांडी

जवाबों:


4

नहीं, वर्तमान में अपरिवर्तनीय डेटा ऑब्जेक्ट बनाने के लिए Magento 2 में कोई बेहतर तरीका नहीं है। आप इसे बना सकते हैं, उदाहरण के लिए इंटरफेस से जेनरेटर गेटर्स और कंस्ट्रक्टर।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.