ฉันรู้ว่าโค้ดจำนวนมากที่อยู่ใน 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);
หากเราต้องการใช้ตัวกรองที่เราใช้การรวมกันของSearchCriteriaBuilderthe 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' คืออะไร? หรือว่าฉันผิดทางตรงนี้ทั้งหมด?