Các phương thức lưu và tải không dùng nữa trong Mô hình Trừu tượng


57

Tôi thấy rằng trong nhánh phát triển của Magento 2 repo, các phương thức loadsavetừ Magento\Framework\Model\AbstractModellớp bị phản đối.
Nhưng có một lớp gazillion trong lõi mở rộng lớp này và sử dụng saveload.
Khi tạo mô-đun của riêng tôi cho phần CRUD của các thực thể của tôi, tôi làm theo các hướng dẫn tương tự như mô-đun lõi.
Nhưng vì những phương pháp này không được chấp nhận, tôi thà chuẩn bị cho tương lai.
Tôi nên sử dụng gì thay vì chúng? Hoặc tôi nên mở rộng cái gì khác?


Có phải các phương pháp này không được chấp nhận?
Knight017

1
Nếu, bây giờ bạn có nghĩa là 2.3, vâng đó là: github.com/magento/magento2/blob/2.3/lib/internal/Magento/...
Marius

Câu trả lời:


34

Bạn nên sử dụng Hợp đồng dịch vụ mô-đun.

Ví dụ: đối với sản phẩm, bạn nên sử dụng ProductRep repositoryInterface

<?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);
}

Nếu Hợp đồng dịch vụ mô-đun không có sẵn, bạn có thể sử dụng ResourceModel để lưu các thực thể.


Tôi hiểu rồi. Điều này thật ý nghĩa. Nhưng bạn có thể xác nhận rằng tất cả các mô-đun CRUD cốt lõi sẽ có hợp đồng dịch vụ tại một thời điểm không?
Marius

1
Tôi thấy rằng việc thực hiện ProductRepositoryInterfacevẫn sử dụng loadtrong các phương thức getgetById. Tôi có nên sử dụng mô hình tài nguyên cho mô-đun của mình thay vì loadphương pháp này không?
Marius

2
có, để mô-đun của bạn sử dụng ResourceModel tốt hơn trong Mô-đun SL của bạn
KAndy

6
bạn có thể vui lòng cho một số mã ví dụ về cách chúng tôi có thể sử dụng ResourceModel
Yogesh Karodiya

1
bạn có bất kì ví dụ nào không? Tôi đã xem xét các mô-đun bản tin và đánh giá chính thức và họ đang gọi "lưu" trực tiếp. Tôi không thể tìm thấy một ví dụ về việc sử dụng ResourceModel. Tôi đã xác định nó cho mô-đun của mình, nhưng làm thế nào để sử dụng nó?
Jāni Elmeris

24

Từ những gì tôi hiểu, những gì sắp xảy ra là Magento sẽ chuyển sang sử dụng hydrators extract()hydrate()phương pháp.

Liên kết này được sử dụng để hoạt động nhưng có vẻ như nhóm Magento đã khôi phục lại: https://github.com/magento/magento2/blob/develop/lib/iternal/Magento/Framework/Model/Entity/EntityHydrator.php

Bạn có thể tìm thấy lịch sử của cam kết tại đây: https://github.com/magento/magento2/tree/09132da06e18dde0f90aabfc962db2bc19b64f3c/lib/iternal/Magento/Framework/Model/

Các tập tin quan trọng là:

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

Tôi cũng đề nghị bạn kiểm tra các tập tin trong Actionthư mục cũng như các Sequencetập tin.

Từ những gì tôi hiểu (tôi có thể hoàn toàn sai ở đây):

  • các tập tin trong Actionthư mục là hành động CRUD
  • các Sequencetập tin là lặp?

Đó là một cuộc trò chuyện đã xảy ra cách đây một thời gian (có phải Alan Storm đã đề cập đến nó không? Không thể nhớ được) vì vậy tôi không chắc liệu nhóm Magento có còn đi theo cách đó không.

Cập nhật

Từ nghiên cứu của tôi, vé Magento nội bộ liên quan đến thay đổi này là MAGETWO-50676, đây là các cam kết liên quan mà tôi quản lý để tìm:

Có thể có nhiều TBH hơn nhưng tôi không cảm thấy muốn duyệt toàn bộ repo cho các tin nhắn cam kết ^^

Nếu bạn không quen thuộc với hydrators, tôi khuyên bạn nên kiểm tra liên kết đó: http://www.webconsults.eu/blog/entry/108-What_is_a_Hydrator_in_Zend_Framework_2

Cập nhật từ 2.1

Magento hiện đang sử dụng EntityManagerlớp để thay thế quyền thừa kế, bạn có thể tìm thêm thông tin ở đây: Magento 2.1: sử dụng trình quản lý thực thể


1
Đồng ý. Lý thuyết tốt đẹp. Nhưng tôi có thể sử dụng một ví dụ từ cốt lõi. Tôi xin lỗi, nhưng kỹ năng magento của tôi tiếp tục sao chép / dán / thay thế :). Bạn đã đề cập đến các tệp Hành động và Trình tự. Bạn có thể cụ thể hơn không?
Marius

@Marius không may đó là tất cả những gì tôi biết. Tôi không thể nhớ mình đã lấy thông tin đó từ đâu nhưng kế hoạch lúc đó là sử dụng cam kết cụ thể này: github.com/magento/magento2/tree/, để thực hiện chuyển đổi từ load()/save()sang hydrators. Tôi giả sử Sequencescông việc giống như các trình vòng lặp và Actionslà các hành động CRUD
Raphael tại Digital Pianism

4
bạn tìm thấy một ví dụ trong phương pháp tải mô hình tài nguyên khối cms hiện tại: github.com/magento/magento2/blob/develop/app/code/Magento/Cms/. Nó sử dụng entityManager-> tải github.com/magento/magento2/ blob / developers / lib / Internal / Magento / Lỗi thực thi thao tác ReadMain (tôi nghĩ) github.com/magento/magento2/blob/develop/lib/i INTERNal / Magento / thép để hydrat hóa thực thể bộ xương với dữ liệu thực thể được tải ( di chuyển tốt đẹp từ Magento;))
David Verholen


2

Một phương pháp thay thế cho Phương pháp tải không dùng được Magento 2 là phương pháp tải mô hình tài nguyên.

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

ở đây tham số đầu tiên là đối tượng mô hình và tham số thứ hai là id bạn muốn tải.

Một phương pháp thay thế cho Phương pháp lưu không dùng được Magento 2 là phương thức lưu mô hình tài nguyên.

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

phương thức lưu chỉ chấp nhận một tham số là đối tượng mô hình của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.