Magento 2 में संग्रह इतिहास हैं?


25

मुझे पता है कि वर्तमान में Magento 2 (2.1.2) में बहुत सारे कोड Magento 1 से अधिक या कम पोर्ट किए गए हैं और भविष्य में एक कोड द्वारा बहुत सारे कोड प्रतिस्थापित किए जाएंगे। इस पहलू में, मैं सोच रहा हूं कि Magento 2 में संग्रह का भविष्य क्या है।

मुझे समझाने दो:

Magento 1:

Magento 1 में हम इस तरह एक संग्रह प्राप्त करने के लिए उपयोग किया जाता है:

$products = Mage::getModel('catalog/product')->getCollection();

फिर हम संग्रह के लिए फ़िल्टर और अन्य ऑपरेशन लागू कर सकते हैं:

$products->addAttributeToFilter('price', ['gteq' => 10]);
$products->addFieldToFilter('created_at', ['lt' => '2016-10-10']);
$products->setPageSize(10);
// ... etc ...

और अंतिम लेकिन कम से कम नहीं, हमारा संग्रह मॉडल लौटाएगा:

foreach ($products as $product) {
    echo get_class($product); // Mage_Catalog_Model_Product
}

Magento 2:

Magento ने अमूर्तता की कई नई परतों को जोड़ा है, जो काम करने के अधिक ठोस तरीके को लागू करता है। इसका मतलब यह है कि जब हम संस्थाओं की एक सूची चाहते हैं, तो हम इसे भंडार से पूछते हैं:

$productResults = $this->productRepository->getList($searchCriteria);

यदि हम फ़िल्टर लागू करना चाहते हैं, तो हम SearchCriteriaBuilder,, और FilterGroupBuilder, के संयोजन का उपयोग FilterBuilderकरते हैं SortOrderBuilder:

$this->searchCriteriaBuilder->addSortOrder(
    $this->sortOrderBuilder
        ->setField('created_at')
        ->setAscendingDirection()
        ->create()
);
$priceFilter = $this->filterBuilder
    ->setField('price')
    ->setValue(10)
    ->setConditionType('gteq')
    ->create();
$createdAtFilter = $this->filterBuilder
    ->setField('created_at')
    ->setValue('2016-10-10')
    ->setConditionType('lt')
    ->create();
$filterGroups = [
    $this->filterGroupBuilder->addFilter($priceFilter)->create(),
    $this->filterGroupBuilder->addFilter($createdAtFilter)->create()
];

और अगर हम अपने परिणामों पर पुनरावृति करना चाहते हैं, तो हमें डेटा मॉडल मिलते हैं, वास्तविक (विरासत में प्राप्त) मॉडल नहीं:

foreach ($productResults->getItems() as $product) {
    echo get_class($product); // \Magento\Catalog\Model\Data\Product
}

इस प्रकार का अमूर्त SOLID सिद्धांत का अनुसरण करता है और 'वंशानुक्रम पर रचना' को ग्रहण करता है । कोई भी 'विदेशी' ऑपरेशन जो संग्रह पर किया जाएगा (उदाहरण के लिए जोड़ की तरह) रिपॉजिटरी में आंतरिक रूप से किया जाता है, जिससे मॉड्यूल के बाहर उपयोग करना भी आसान हो जाता है।

प्रश्न:

यह सब मुझे आश्चर्यचकित करता है: पूरे रिपॉजिटरी / डेटा मॉडल-एप्रोच के साथ, क्या संग्रह के लिए Magento 2 के भविष्य में कोई जगह है? क्या संग्रह केवल मॉड्यूल द्वारा आंतरिक रूप से उपयोग किया जाना है और इसके बाहर नहीं? या इकाई प्रबंधक के पक्ष में पदावनत होने जा रहे हैं?

वर्तमान में, यदि आप डेटा मॉडल को गले लगाना चाहते हैं, तो आपको अभी भी एक विरासत वाला मॉडल बनाना होगा (विरासत में मिला हुआ \Magento\Framework\Model\AbstractModel) बस संग्रह को काम करने के लिए (क्योंकि Magento\Framework\Data\Collection::setItemObjectClassमॉडल से विस्तार करने की आवश्यकता है Magento\Framework\DataObject)। और आपको अपने भंडार में फ़िल्टर करने में सक्षम होने के लिए संग्रह करने की आवश्यकता है। लेकिन फिर, रिपॉजिटरी में आपको अपने (नियमित) मॉडल को डेटा मॉडल में परिवर्तित करना होगा।

या क्या हमें इसे ऑर्डर रिपॉजिटरी की तरह लागू करना होगा, जहां getList()रिटर्न का एक उदाहरण है Magento\Sales\Api\Data\OrderSearchResultInterface, लेकिन पानी के तहत खोज परिणाम इस इंटरफ़ेस को लागू करने वाले नियमित संग्रह से अधिक कुछ नहीं हैं। मजेदार तथ्य: खोज परिणाम बताता है कि यह डेटा मॉडल की एक सरणी लौटाएगा ( Magento\Sales\Api\Data\OrderInterface[]), लेकिन यदि आप कोड का विश्लेषण करते हैं, getItems()तो निष्पादित करेगा Magento\Framework\Data\Collection::getItems()जो बदले में डेटा मॉडल नहीं देता है, लेकिन ऑर्डर मॉडल (जैसा कि सेट Magento\Sales\Model\ResourceModel\Order\Collection::_construct())। 'विरासत से अधिक रचना' के लिए बहुत कुछ।

मैगेंटो में उचित तरीका क्या है, इस पर बहुत सारे सवाल। फिर, एक ही काम करने के 100 तरीके हैं, लेकिन 'द मैगेंटो वे' क्या है? या मैं यहाँ पूरी तरह से गलत रास्ते पर हूँ?


2
असली सवाल यहाँ पूछ रहा है +1। मैं वास्तव में एक कोर देव जवाब यहाँ प्यार होता
मेरियस

मेरा मानना ​​है कि यह योजना संग्रह के लिए चरणबद्ध है। हालांकि जैसा कि आपने देखा कि यह लगभग पूरा होने के करीब भी नहीं है और बहुत सारे क्षेत्र हैं जो कि रिफ्लेक्ट होने के विभिन्न राज्यों में प्रतीत होते हैं (मैगेंटो के रूप में स्थिर एपीआई होने के नाते / एप्पी \ डेटा \ ऑर्डरसर्चस्काउटलइंटरफेस), मैगेंटो को बदलने की अनुमति देता है हूड के तहत अधिक आसानी से बाद में होता है)। यह मदद नहीं करता है कि गेटलिस्ट के विभिन्न कार्यान्वयन अभी तक उतने सक्षम नहीं हैं जितना कि हम वर्तमान में संग्रह के साथ कर सकते हैं। आपके द्वारा बताई गई विसंगति के बारे में बताया गया है कि वह जीथब पर एक मुद्दे के लिए योग्य हो सकता है।
फोमन

जवाबों:


16

संग्रह अब हटाए नहीं गए हैं। हालांकि कुछ मॉड्यूल पहले से ही सर्विस कॉन्ट्रैक्ट एपीआई को उजागर करते हैं, अन्य अभी भी केवल मॉडल / कलेक्शन एपीआई को उजागर करते हैं।

योजना है:

  1. बेहतर @api कवरेज के साथ वर्तमान स्थिति को प्रतिबिंबित करें: @api के साथ कुछ मॉड्यूल में सार संग्रह और विशिष्ट संग्रह एनोटेट करें
  2. वंशानुक्रम-आधारित API पर निर्भरता के बिना सेवा अनुबंध के आसान निर्माण की अनुमति देने के लिए दृढ़ता ढांचे में सुधार करें: संग्रह, मॉडल, संसाधन मॉडल
  3. सेवा अनुबंधों के संग्रह-आधारित कार्यान्वयन को बढ़ावा नहीं देने के लिए सार संग्रह को चित्रित करें
  4. सेवा अनुबंध एपीआई के साथ मॉड्यूल के नए संस्करणों को धीरे-धीरे जारी करें

इसलिए कुछ बिंदुओं पर संग्रह को हटा दिया जाएगा, लेकिन अब वे Magento 2 API में से एक हैं।

सेवा अनुबंधों के कार्यान्वयन के लिए, - मॉडल और संग्रह उन्हें Magento <= 2.1 में लागू करने का एकमात्र सुविधाजनक तरीका है। सेवा अनुबंध सिर्फ इंटरफेसेस हैं। उनका कार्यान्वयन सार्वजनिक API का हिस्सा नहीं है और बाद में इसे बदला जा सकता है।


1
आपके उत्तर के लिए धन्यवाद। तो नए मॉड्यूल बनाने वाले डेवलपर्स के लिए आपकी सलाह क्या है? मेरी वर्तमान रणनीति सेवा अनुबंध बनाने की है जो (पानी के नीचे) अभी भी संग्रह का उपयोग करते हैं क्योंकि a) यह फ़िल्टरिंग को आसान बनाता है, और b) इकाई प्रबंधक अभी भी प्रायोगिक / अनिर्दिष्ट है। कुछ बिंदु पर आंतरिक कामकाज को किसी और चीज से बदला जा सकता है लेकिन इंटरफ़ेस समान रहता है। लेकिन अगर मैं आपके उत्तर को सही ढंग से समझूं तो अभी के लिए उचित तरीका है?
गियल बर्क

सही बात। मैंने इसे दर्शाने के लिए अपना उत्तर संपादित किया।
एंटोन क्रिल

1
उपरोक्त को ध्यान में रखते हुए, कार्यक्षमता को लागू करने का उचित तरीका क्या होगा जिसमें डेटा की आवश्यकता होती है जिसे सेवा अनुबंध के माध्यम से प्राप्त नहीं किया जा सकता है? एक उदाहरण के लिए, यदि मॉड्यूल ए को भुगतान विधि द्वारा फ़िल्टर किए गए सभी आदेशों की आवश्यकता होती है।
स्टेपेपैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.