คำถามติดแท็ก repository

5
เมื่อใดที่เราควรใช้ที่เก็บและโรงงานใน Magento 2
ฉันได้ผ่านบทช่วยสอนใน Magento 2 และสิ่งนี้ทำให้ฉันสับสนเล็กน้อย ฉันเห็นว่ามีสองวิธีที่เราสามารถอ่าน / เขียนเอนทิตีธุรกิจได้: ดึงข้อมูล ใช้วิธีการจากโรงงาน $object = $this->myFactory->create(); $object->load($myId); การใช้วิธีการเก็บข้อมูล $repo = $this->myRepository(); $object = $repo->getById($myId); บันทึกข้อมูล ใช้วิธีการจากโรงงาน $object = $this->myFactory->create(); $object->load($myId); $object->setData('something', 'somethingDifferent')->save(); การใช้วิธีการเก็บข้อมูล $repo = $this->myRepository(); $object = $repo->getById($myId); $object->setData('something', 'somethingDifferent'); $repo->save($object); ฉันยังสามารถเห็นว่าทั้งพื้นที่เก็บข้อมูลและชั้นโรงงานสามารถฉีดโดยใช้การฉีดพึ่งพา อย่างน้อยก็ทำให้ฉันสับสน เมื่อใดที่เราควรใช้วิธีการจัดเก็บและวิธีการจากโรงงาน? การปฏิบัติที่ดีที่สุดที่เราต้องทำคืออะไร?

1
คอลเล็กชันมีประวัติใน Magento 2 หรือไม่
ฉันรู้ว่าโค้ดจำนวนมากที่อยู่ใน 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 } …

3
มีเหตุผลใดที่จะชอบ $ model-> load () มากกว่าสัญญาบริการหรือไม่?
ฉันเข้าใจว่าวิธีที่ต้องการใช้ระหว่างโมดูลใน Magento 2 คือการใช้สัญญาบริการ ดังนั้นถ้าฉันต้องการโหลดผลิตภัณฑ์ฉันใช้ที่เก็บผลิตภัณฑ์: $product = $productRepository->getById($id); Magento\Catalog\Api\Data\ProductInterfaceซึ่งเป็นตามสัญญากลับตัวอย่างของ แต่ฉันสามารถใช้วิธีเดิมแทนการเรียกเลเยอร์โดเมนโดยตรง: $product = $productFactory->create()->load($id); มีกรณีใดบ้างที่จำเป็นหรือมีประโยชน์? devdocs พูด (เน้นเพิ่ม): โมดูลสามารถโทรเข้าสู่โมดูลอื่นโดยตรง โซลูชั่นนี้คู่แน่นไม่แนะนำสำหรับสถานการณ์ส่วนใหญ่ แต่บางครั้งก็หลีกเลี่ยงไม่ได้ [ ... ] กลยุทธ์ของคุณสำหรับการเรียกรหัสโดเมนของโมดูลอื่นนั้นขึ้นอยู่กับการกำหนดค่าและความต้องการของระบบของคุณเป็นพิเศษ ที่มา: http://devdocs.magento.com/guides/v2.0/architecture/archi_perspectives/domain_layer.html และความคิดเห็นเกี่ยวกับคำถามที่เกี่ยวข้องระบุไว้: การใช้พื้นที่เก็บข้อมูลจะทำให้คุณมีแบบจำลองข้อมูลผลิตภัณฑ์( Api/Data/Product) ซึ่งเป็นรูปแบบผลิตภัณฑ์ที่ถูกแปลงเป็น DTO ที่ล้าสมัย สิ่งที่ควรพิจารณาเนื่องจากมันค่อนข้างแตกต่างกัน แต่เท่าที่ฉันสามารถเห็นวัตถุเหมือนกันภายใต้สภาวะปกติเพียงแค่ชนิดส่งคืนต่อ phpDoc แตกต่างกัน ( Magento\Catalog\Api\Data\ProductInterface/ Magento\Catalog\Model\Product)

2
การกรองคลังเก็บวัตถุวีโอไอพี 2
ใน Magento 2 คุณสามารถใช้ที่เก็บผลิตภัณฑ์เพื่อกรองตามคุณสมบัติของผลิตภัณฑ์ได้หรือไม่? ใน Magento 2 คุณสามารถใช้วัตถุเงื่อนไขการค้นหา \Magento\Framework\Api\SearchCriteriaInterface $searchCriteria, และพื้นที่เก็บข้อมูล \Magento\Catalog\Api\ProductRepositoryInterface $productRepository, เพื่อดึงรายการของวัตถุ $searchCriteria->getPageSize(10); $list = $productRepository->getList($searchCriteria); อย่างไรก็ตามวัตถุ searchCriteria ไม่มี (ดูเหมือนว่า?) มีความสามารถในการกรองโดยตรง ชั้นเกณฑ์การค้นหาไม่มีวิธีการสำหรับการเพิ่มสิ่งที่เรียกว่า filterGroups #File: lib/internal/Magento/Framework/Api/SearchCriteria.php public function getFilterGroups() { $filterGroups = $this->_get(self::FILTER_GROUPS); return is_array($filterGroups) ? $filterGroups : []; } public function setFilterGroups(array $filterGroups = null) { return $this->setData(self::FILTER_GROUPS, …

2
Magento 2: ที่เก็บผลิตภัณฑ์กลุ่มตัวกรองและ `AND '
ฉันกำลังพยายามใช้ที่เก็บผลิตภัณฑ์เพื่อดึงรายการผลิตภัณฑ์ ฉันต้องการดึงข้อมูลตามตัวกรองสองตัวรวมกับANDเกณฑ์ แต่สิ่งต่าง ๆ ดูเหมือนจะไม่ทำงาน ฉันไม่เข้าใจว่ากลุ่มตัวกรองทำงานอย่างไร หรือนี่เป็นข้อบกพร่องที่ควรรายงานหรือไม่ โดยเฉพาะอย่างยิ่ง (ตัวอย่างที่โง่เพื่อเห็นแก่ความเรียบง่าย) ฉันมีตัวสร้างที่ฉันฉีดตัวสร้างตัวกรองตัวสร้างกลุ่มตัวกรองและตัวสร้างเกณฑ์การค้นหา public function __construct( \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder, \Magento\Framework\Api\FilterBuilder $filterBuilder, \Magento\Framework\Api\Search\FilterGroupBuilder $filterGroupBuilder ) { $this->searchCriteriaBuilder = $searchCriteriaBuilder; $this->filterBuilder = $filterBuilder; $this->filterGroupBuilder = $filterGroupBuilder; } จากนั้นในวิธีต่อมาฉันใช้ตัวสร้างตัวกรองเพื่อสร้างตัวกรองสองตัว $filter1 = $this->filterBuilder->setField('sku') ->setValue('24-MB01') ->setConditionType('eq') ->create(); $filter2 = $this->filterBuilder->setField('sku') ->setValue('WT08-XS-Black') ->setConditionType('eq') ->create(); จากนั้นฉันใช้เครื่องมือสร้างกลุ่มตัวกรองเพื่อสร้างกลุ่มตัวกรองที่ประกอบด้วยตัวกรองทั้งสองนี้ $filter_group = $this->filterGroupBuilder ->addFilter($filter1) ->addFilter($filter2) …

2
ฉันจะบันทึกเอนทิตีของโมเดลใหม่หรือที่อัพเดตได้อย่างไร?
ใน Magento 2 เรามีคลาสที่เก็บข้อมูล วิธีคลาสสิกที่save()ใช้อย่างมากใน Magento 1.9 ถูกคัดค้านถ้าฉันถูกต้องจาก 2.04 หรือ 2.05 ฉันใช้โรงงานเพื่อสร้างวัตถุใหม่และหลังจากตั้งค่าคุณสมบัติของใหม่ตัวอย่างเช่นผลิตภัณฑ์ที่ฉันเรียกว่าsave(): $productFactory->create()->setName()...->save() ในทางกลับกันเรามีที่เก็บซึ่งมีวิธีการsaveด้วย ฉันใช้มันสั้น ๆ เช่นนี้: $product = $productFactory->create()->setName()... $productRepository->save($product) ในรหัสของฉันฉันมีชั้นเรียนทำงานทั้งสองวิธี ฉันยังสังเกตเห็นว่าบางครั้งวิธีที่แตกต่างหมายถึงพฤติกรรมที่แตกต่าง มีวิธีการกับที่เก็บข้อมูลบางอย่างในการตรวจสอบความถูกต้องของข้อมูลเพิ่มเติมหรือไม่? ฉันควรทำอย่างไร
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.