मुझे पता है कि वर्तमान में 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 तरीके हैं, लेकिन 'द मैगेंटो वे' क्या है? या मैं यहाँ पूरी तरह से गलत रास्ते पर हूँ?