คอลเล็กชันมีประวัติใน Magento 2 หรือไม่


25

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


2
ถามคำถามจริงที่นี่ +1 ฉันจะรักคำตอบหลักที่แท้จริงที่นี่
Marius

ฉันเชื่อว่าแผนสำหรับคอลเล็คชั่นจะยุติ อย่างไรก็ตามในขณะที่คุณสังเกตเห็นว่านี่ยังไม่ใกล้เคียงกับที่จะประสบความสำเร็จและมีหลายพื้นที่ที่ดูเหมือนจะอยู่ในสถานะต่าง ๆ ของการเป็น refactored (มี api ที่มั่นคงเป็น Magento \ Sales \ Api \ Data \ OrderSearchResultInterface เกิดขึ้นภายใต้ประทุนได้ง่ายขึ้นในภายหลัง) มันไม่ได้ช่วยให้การใช้งานที่หลากหลายของ getList ยังไม่สามารถทำได้เท่าที่เราสามารถทำได้กับคอลเลกชันในปัจจุบัน ความไม่สอดคล้องที่คุณสังเกตเห็นรอบ ๆ การส่งคืนที่ระบุอาจมีค่าสำหรับปัญหาใน GitHub
Kristof ที่ Fooman

คำตอบ:


16

คอลเล็กชันไม่ได้ถูกคัดค้านในขณะนี้ ในขณะที่โมดูลบางโมดูลได้เปิดเผย Service Contract APIs แล้วบางโมดูลก็ยังคงเปิดเผยเฉพาะ API / Collection แบบ

แผนคือ:

  1. แสดงสถานะปัจจุบันด้วยความครอบคลุมที่ดีขึ้นของ @api: ใส่คำอธิบายประกอบแบบนามธรรมและชุดเฉพาะในบางโมดูลด้วย @api
  2. ปรับปรุงกรอบการคงอยู่เพื่อให้สามารถสร้างสัญญาการบริการได้ง่ายโดยไม่ต้องพึ่ง API ที่อิงกับการสืบทอด: คอลเลกชัน, โมเดล, โมเดลทรัพยากร
  3. คัดค้านการเก็บรวบรวมบทคัดย่อเพื่อไม่ส่งเสริมการใช้งานตามสัญญาบริการ
  4. ปล่อยโมดูลรุ่นที่ใหม่กว่าทีละน้อยด้วย Service Contract APIs

ดังนั้นการสะสมจะถูกยกเลิกในบางจุด แต่ตอนนี้มันเป็นหนึ่งใน Magento 2 API

สำหรับการดำเนินการตามสัญญาการบริการ - รุ่นและคอลเลกชันเป็นวิธีเดียวที่สะดวกในการใช้พวกเขาใน Magento <= 2.1 สัญญาบริการเป็นเพียงการเชื่อมต่อ การใช้งานของพวกเขาไม่ได้เป็นส่วนหนึ่งของ API สาธารณะและอาจมีการเปลี่ยนแปลงในภายหลัง


1
ขอบคุณสำหรับคำตอบ. ดังนั้นคำแนะนำของคุณสำหรับนักพัฒนาที่สร้างโมดูลใหม่คืออะไร? กลยุทธ์ปัจจุบันของฉันคือการสร้างสัญญาการบริการที่ (ยังอยู่ใต้น้ำ) ยังคงใช้คอลเล็กชันเนื่องจาก) ทำให้การกรองง่ายและ b) ผู้จัดการเอนทิตียังคงอยู่ในช่วงทดลอง / ไม่มีเอกสาร ในบางจุดงานด้านในสามารถถูกแทนที่ด้วยสิ่งอื่นได้ แต่ส่วนต่อประสานยังคงเหมือนเดิม แต่ถ้าฉันเข้าใจคำตอบของคุณอย่างถูกต้องนั่นเป็นวิธีที่เหมาะสมสำหรับตอนนี้ใช่ไหม
Giel Berkers

แก้ไข. ฉันแก้ไขคำตอบเพื่อสะท้อนสิ่งนี้
Anton Kril

1
จากการพิจารณาข้างต้นสิ่งที่จะเป็นวิธีที่เหมาะสมในการใช้งานฟังก์ชั่นที่ต้องใช้ข้อมูลที่ไม่สามารถเรียกผ่านสัญญาบริการ ตัวอย่างเช่นหากโมดูล A ต้องการคำสั่งซื้อทั้งหมดที่กรองโดยวิธีการชำระเงิน
Stjepan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.