วิธีการบันทึกและโหลดที่ไม่สอดคล้องในรูปแบบนามธรรม


57

ฉันเห็นว่าในแผนกพัฒนาของ Magento 2 repo วิธีการloadและsaveจากMagento\Framework\Model\AbstractModelชั้นเรียนเลิกใช้แล้ว
แต่มีการเรียนการ gazillion ในหลักที่ขยายชั้นนี้และใช้และsave เมื่อสร้างโมดูลของตัวเองสำหรับส่วน CRUD ของเอนทิตีของฉันฉันทำตามแนวทางเดียวกันกับที่เป็นโมดูลหลัก แต่เนื่องจากวิธีการเหล่านี้เลิกใช้แล้วฉันจึงควรเตรียมพร้อมสำหรับอนาคต ฉันควรใช้อะไรแทนพวกเขา หรือฉันควรขยายอย่างอื่น?load



วิธีการเหล่านี้เลิกใช้แล้วหรือยัง?
Knight017

1
ถ้าตอนนี้คุณหมายถึง 2.3 ใช่แล้วพวกเขาคือ: github.com/magento/magento2/blob/2.3/lib/internal/Magento/ ......
Marius

คำตอบ:


34

คุณควรใช้โมดูลบริการสัญญา

ตัวอย่างเช่นสำหรับผลิตภัณฑ์คุณควรใช้ProductRepositoryInterface

<?php
/**
 *
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */

namespace Magento\Catalog\Api;

/**
 * @api
 * @since 100.0.2
 */
interface ProductRepositoryInterface
{
    /**
     * Create product
     *
     * @param \Magento\Catalog\Api\Data\ProductInterface $product
     * @param bool $saveOptions
     * @return \Magento\Catalog\Api\Data\ProductInterface
     * @throws \Magento\Framework\Exception\InputException
     * @throws \Magento\Framework\Exception\StateException
     * @throws \Magento\Framework\Exception\CouldNotSaveException
     */
    public function save(\Magento\Catalog\Api\Data\ProductInterface $product, $saveOptions = false);

    /**
     * Get info about product by product SKU
     *
     * @param string $sku
     * @param bool $editMode
     * @param int|null $storeId
     * @param bool $forceReload
     * @return \Magento\Catalog\Api\Data\ProductInterface
     * @throws \Magento\Framework\Exception\NoSuchEntityException
     */
    public function get($sku, $editMode = false, $storeId = null, $forceReload = false);

    /**
     * Get info about product by product id
     *
     * @param int $productId
     * @param bool $editMode
     * @param int|null $storeId
     * @param bool $forceReload
     * @return \Magento\Catalog\Api\Data\ProductInterface
     * @throws \Magento\Framework\Exception\NoSuchEntityException
     */
    public function getById($productId, $editMode = false, $storeId = null, $forceReload = false);

    /**
     * Delete product
     *
     * @param \Magento\Catalog\Api\Data\ProductInterface $product
     * @return bool Will returned True if deleted
     * @throws \Magento\Framework\Exception\StateException
     */
    public function delete(\Magento\Catalog\Api\Data\ProductInterface $product);

    /**
     * @param string $sku
     * @return bool Will returned True if deleted
     * @throws \Magento\Framework\Exception\NoSuchEntityException
     * @throws \Magento\Framework\Exception\StateException
     */
    public function deleteById($sku);

    /**
     * Get product list
     *
     * @param \Magento\Framework\Api\SearchCriteriaInterface $searchCriteria
     * @return \Magento\Catalog\Api\Data\ProductSearchResultsInterface
     */
    public function getList(\Magento\Framework\Api\SearchCriteriaInterface $searchCriteria);
}

ถ้า Module Service Contract ไม่พร้อมใช้งานคุณสามารถใช้ ResourceModel เพื่อบันทึกเอนทิตี


ฉันเห็น. มันสมเหตุสมผลแล้ว แต่คุณสามารถยืนยันได้ว่าโมดูล CRUD หลักทั้งหมดจะมีสัญญาบริการ ณ จุดหนึ่งหรือไม่
Marius

1
ผมเห็นว่าการดำเนินการProductRepositoryInterfaceยังคงใช้loadในวิธีการและget getByIdฉันควรใช้โมเดลทรัพยากรสำหรับโมดูลแทนloadวิธีนี้หรือไม่?
Marius

2
ใช่เพื่อให้โมดูลของคุณดีกว่าที่จะใช้ ResourceModel ใน Module SL ของคุณ
KAndy

6
คุณกรุณาให้รหัสตัวอย่างสำหรับวิธีที่เราสามารถใช้ ResourceModel
Yogesh Karodiya

1
คุณมีตัวอย่างหรือไม่? ฉันดูที่การตรวจสอบอย่างเป็นทางการและโมดูลจดหมายข่าวและพวกเขากำลังเรียก "บันทึก" โดยตรง ฉันไม่พบตัวอย่างการใช้ ResourceModel ฉันได้กำหนดไว้สำหรับโมดูลของฉันแล้ว แต่จะใช้อย่างไร
Jānis Elmeris

24

จากสิ่งที่ฉันเข้าใจสิ่งที่จะเกิดขึ้นคือวีโอไอพีเป็นไปสลับไปกับ hydrators extract()และhydrate()วิธีการ

ลิงค์นี้ใช้ในการทำงาน แต่ดูเหมือนว่าทีมของ Magento จะย้อนกลับมาที่: https://github.com/magento/magento2/blob/develop/lib/internal/Magento/Framework/Model/EntityHydrator.php

คุณสามารถค้นหาประวัติความเป็นมาของการกระทำได้ที่นี่: https://github.com/magento/magento2/tree/09132da06e18dde0f90aabfc962db2bc19b64f3c/lib/internal/Magento/Framework/Model/Entity

ไฟล์สำคัญคือ:

  • EntityHydrator.php
  • EntityMetadata.php
  • HydratorInterface.php
  • MetadataPool.php

ฉันยังขอแนะนำให้คุณตรวจสอบไฟล์ภายใต้Actionโฟลเดอร์เช่นเดียวกับSequenceไฟล์

จากสิ่งที่ฉันเข้าใจ (ฉันอาจผิดโดยสิ้นเชิงที่นี่):

  • ไฟล์ที่อยู่ในActionโฟลเดอร์เป็นการกระทำที่ CRUD
  • Sequenceไฟล์ iterators?

นั่นเป็นบทสนทนาที่เกิดขึ้นเมื่อไม่นานมานี้ (นั่นคืออลันสตอร์มที่เอ่ยถึงหรือจำไม่ได้) ดังนั้นฉันไม่แน่ใจว่าทีมวีโอไอพียังคงเดินหน้าต่อไป

ปรับปรุง

จากการวิจัยของฉันตั๋ว Magento ภายในเกี่ยวกับการเปลี่ยนแปลงนี้คือ MAGETWO-50676 นี่คือข้อผูกพันที่เกี่ยวข้องที่ฉันจัดการเพื่อค้นหา:

อาจมี TBH มากกว่านี้ แต่ฉันไม่รู้สึกอยากเรียกดู repo ทั้งหมดเพื่อส่งข้อความ ^^

หากคุณไม่คุ้นเคยกับผู้ให้ความชุ่มชื้นฉันแนะนำให้คุณตรวจสอบลิงก์นั้น: http://www.webconsults.eu/blog/entry/108-What_is_a_Hydrator_in_Zend_Framework_2

อัพเดทจาก 2.1

Magento กำลังใช้EntityManagerคลาสเพื่อแทนที่การสืบทอดที่คุณสามารถหาข้อมูลเพิ่มเติมได้ที่นี่: Magento 2.1: การใช้ตัวจัดการเอนทิตี


1
ตกลง. ทฤษฎีที่ดี แต่ฉันสามารถใช้ตัวอย่างจากแกนกลาง ฉันขอโทษ แต่ทักษะวีโอไอพีของฉันดำเนินการต่อเพื่อคัดลอก / วาง / แทนที่ :) คุณพูดถึงไฟล์ Action และ Sequence คุณจะเจาะจงมากขึ้นได้ไหม?
Marius

@Marius โชคร้ายนั่นคือทั้งหมดที่ฉันรู้ ฉันจำไม่ได้ว่าฉันได้รับข้อมูลจากที่ใด แต่แผนในเวลานั้นคือการใช้การส่งข้อมูลเฉพาะนี้: github.com/magento/magento2/tree/…เพื่อใช้สวิตช์จากเครื่องload()/save()ทำน้ำอุ่น ฉันถือว่าSequencesทำงานเหมือนตัววนซ้ำและActionsเป็นการกระทำ CRUD
Raphael ที่ Digital Pianism

4
คุณพบตัวอย่างในวิธีโหลดโมเดลทรัพยากรบล็อก cms ปัจจุบัน: github.com/magento/magento2/blob/develop/app/code/Magento/Cms/ ...... มันใช้ entityManager-> load github.com/magento/magento/magento2/ blob / development / lib / internal / Magento / …ซึ่งเรียกใช้งาน ReadMain (ฉันคิดว่า) github.com/magento/magento2/blob/develop/lib/internal/Magento/ซึ่งเพิ่มเอนทิตีโครงกระดูกด้วยข้อมูลเอนทิตีที่โหลด ( ย้ายที่ดีจาก Magento;))
David Verholen


2

อีกวิธีหนึ่งในการโหลด Magento 2 Deprecated เป็นวิธีการโหลดโมเดลทรัพยากร

public funtion getCustomer($id)
{
   $customerModel = $this->customerFactory->create();
   $this->customerResource->load($customerModel, $id);
   $customerModel->getEmail();  
}

ที่นี่พารามิเตอร์แรกคือวัตถุรูปแบบและพารามิเตอร์ที่สองคือรหัสที่คุณต้องการโหลด

อีกทางเลือกหนึ่งสำหรับวิธีการบันทึกวีโอไอพีที่คัดค้านนั้นเป็นวิธีการบันทึกแบบจำลองทรัพยากร

public funtion save($taskData)
{
   $taskModel = $this->taskFactory->create()->setData($taskData);
   $this->resource->save($taskModel);
}

วิธีการบันทึกยอมรับเพียงหนึ่งพารามิเตอร์ที่เป็นวัตถุรูปแบบของคุณ

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