ฉันรู้ว่าโค้ดจำนวนมากที่อยู่ใน Magento 2 (2.1.2) ในปัจจุบันมีการย้ายพอร์ตมากขึ้นหรือน้อยลงจาก Magento 1 และโค้ดจำนวนมากจะถูกแทนที่ด้วยสิ่งที่เทียบเท่าในอนาคต ในแง่นี้ฉันสงสัยว่าอนาคตของคอลเลกชันใน Magento 2 คืออะไร
ให้ฉันอธิบาย:
วีโอไอพี 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
}
วีโอไอพี 2:
Magento เพิ่มเลเยอร์ abstraction ใหม่ ๆ จำนวนมากโดยใช้วิธีการทำงานแบบทึบมากขึ้น ซึ่งหมายความว่าเมื่อเราต้องการรายชื่อของเอนทิตี้เราถามจากที่เก็บ:
$productResults = $this->productRepository->getList($searchCriteria);
หากเราต้องการใช้ตัวกรองที่เราใช้การรวมกันของSearchCriteriaBuilder
the FilterGroupBuilder
, the 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 สำหรับคอลเลกชันหรือไม่? คอลเลกชันเท่านั้นที่จะใช้ภายในโดยตัวโมดูลเองและไม่ได้อยู่นอกมัน? หรือจะเลิกใช้ในความโปรดปรานของ Entity Manager?
ปัจจุบันหากคุณต้องการยอมรับตัวแบบข้อมูลคุณยังต้องสร้างแบบจำลองที่สืบทอดมา (สืบทอดมาจาก\Magento\Framework\Model\AbstractModel
) เพียงเพื่อให้การรวบรวมทำงาน (เนื่องจากMagento\Framework\Data\Collection::setItemObjectClass
ต้องใช้แบบจำลองเพื่อขยายออกไปMagento\Framework\DataObject
) และคุณต้องรวบรวมเพื่อให้สามารถกรองในพื้นที่เก็บข้อมูลของคุณ แต่จากนั้นอีกครั้งในพื้นที่เก็บข้อมูลคุณต้อง 'แปลง' รุ่น (ปกติ) ของคุณเป็นรูปแบบข้อมูล
หรือว่าเราจะต้องใช้มันอย่างเช่น Repository ที่ซึ่งgetList()
ผลตอบแทนเป็นตัวอย่างMagento\Sales\Api\Data\OrderSearchResultInterface
แต่ใต้น้ำผลลัพธ์การค้นหาไม่ได้เป็นอะไรมากไปกว่าคอลเลคชั่นปกติที่ใช้อินเทอร์เฟซนี้ สนุกจริง: ผลการค้นหาระบุว่ามันจะส่งคืนอาร์เรย์ของตัวแบบข้อมูล ( Magento\Sales\Api\Data\OrderInterface[]
) แต่ถ้าคุณวิเคราะห์รหัสgetItems()
จะดำเนินการMagento\Framework\Data\Collection::getItems()
ซึ่งผลตอบแทนไม่ใช่แบบจำลองข้อมูล แต่เป็นการสั่งแบบจำลอง (ตามที่กำหนดMagento\Sales\Model\ResourceModel\Order\Collection::_construct()
) มากสำหรับ 'องค์ประกอบมากกว่ามรดก'
คำถามมากมายเกี่ยวกับวิธีการที่เหมาะสมใน Magento 2 อีกครั้งมี 100 วิธีในการทำสิ่งเดียวกัน แต่ 'วิธี Magento' คืออะไร? หรือว่าฉันผิดทางตรงนี้ทั้งหมด?