Metode penyimpanan dan muat yang usang dalam Model Abstrak

57

Saya melihat bahwa di cabang berkembang dari Magento 2 repo metode loaddan savedari Magento\Framework\Model\AbstractModelkelas sudah usang.
Tetapi ada trilyun kelas di inti yang memperluas kelas ini dan menggunakan savedan load.
Saat membuat modul saya sendiri untuk bagian CRUD dari entitas saya, saya mengikuti pedoman yang sama dengan modul inti.
Tetapi karena metode ini sudah usang saya lebih suka dipersiapkan untuk masa depan.
Apa yang harus saya gunakan daripada mereka? Atau saya harus memperpanjang sesuatu yang lain?

Marius
sumber
Apakah metode ini sudah usang sekarang?
Knight017
1
Jika, maksud Anda sekarang 2.3, ya mereka adalah: github.com/magento/magento2/blob/2.3/lib/internal/Magento/…
Marius

Jawaban:

34

Anda harus menggunakan Kontrak Layanan Modul.

Misalnya untuk produk Anda harus menggunakan 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);
}

Jika Kontrak Layanan Modul tidak tersedia, Anda dapat menggunakan ResourceModel untuk menyimpan entitas.

KAndy
sumber
Saya melihat. Ini masuk akal. Tetapi dapatkah Anda mengonfirmasi bahwa semua modul inti CRUD akan memiliki kontrak layanan pada satu titik?
Marius
1
Saya melihat bahwa implementasi ProductRepositoryInterfacemasih menggunakan loadmetode getdan getById. Haruskah saya menggunakan model sumber daya untuk modul saya daripada loadmetode ini ?
Marius
2
ya, untuk modul Anda lebih baik menggunakan ResourceModel di Modul SL
KAndy
6
dapatkah Anda memberikan beberapa contoh kode untuk bagaimana kami dapat menggunakan ResourceModel
Yogesh Karodiya
1
Apakah Anda punya contoh? Saya melihat ulasan resmi dan modul buletin, dan mereka memanggil "simpan" secara langsung. Saya tidak dapat menemukan contoh penggunaan ResourceModel. Saya sudah mendefinisikannya untuk modul saya, tetapi bagaimana cara menggunakannya?
Jānis Elmeris
24

Dari apa yang saya pahami, apa yang akan terjadi adalah Magento akan beralih ke hydrator extract()dan hydrate()metode.

Tautan ini dulu berfungsi tetapi sepertinya tim Magento mengembalikannya: https://github.com/magento/magento2/blob/develop/lib/internal/Magento/Framework/Model/Entity/EntityHydrator.php

Anda dapat menemukan riwayat komit di sini: https://github.com/magento/magento2/tree/09132da06e18dde0f90aabfc962db2bc19b64f3c/lib/internal/Magento/Framework/Model/Entity

File-file penting adalah:

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

Saya juga menyarankan Anda memeriksa file di bawah Actionfolder dan juga Sequencefile.

Dari apa yang saya mengerti (saya mungkin benar-benar salah di sini):

  • file di bawah Actionfolder adalah tindakan CRUD
  • yang Sequencefile yang iterator?

Itu adalah percakapan yang terjadi beberapa saat yang lalu (apakah Alan Storm yang menyebutkannya? Tidak ingat) jadi saya tidak yakin apakah tim Magento masih berjalan seperti itu.

Memperbarui

Dari penelitian saya, tiket Magento internal mengenai perubahan ini adalah MAGETWO-50676, berikut adalah komitmen terkait yang berhasil saya temukan:

Mungkin ada lebih banyak TBH, tetapi saya tidak ingin menelusuri seluruh repo untuk pesan komit ^^

Jika Anda tidak terbiasa dengan hydrator, saya sarankan Anda memeriksa tautan itu: http://www.webconsults.eu/blog/entry/108-What_is_a_Hydrator_in_Zend_Framework_2

Perbarui dari 2.1

Magento sekarang menggunakan EntityManagerkelas untuk menggantikan warisan Anda dapat menemukan informasi lebih lanjut di sini: Magento 2.1: menggunakan manajer entitas

Raphael di Digital Pianism
sumber
1
Baik. Teori yang bagus. Tapi saya bisa menggunakan contoh dari intinya. Maaf, tetapi keterampilan magento saya melanjutkan untuk menyalin / menempel / mengganti :). Anda menyebutkan file Action and Sequence. Bisakah Anda lebih spesifik?
Marius
@Marius sayangnya hanya itu yang saya tahu. Saya tidak ingat dari mana saya mendapatkan info itu tetapi rencananya saat itu adalah menggunakan komit khusus ini: github.com/magento/magento2/tree/… untuk mengimplementasikan peralihan dari load()/save()ke hydrator. Saya menganggap Sequencespekerjaan seperti iterator dan Actionsmerupakan tindakan CRUD
Raphael di Digital Pianism
4
Anda menemukan contoh dalam metode pemuatan model sumber blok cms saat ini: github.com/magento/magento2/blob/develop/app/code/Magento/Cms/… Ini menggunakan entitasManager-> load github.com/magento/magento2/ gumpalan / kembangkan / lib / internal / Magento / ... yang menjalankan operasi ReadMain (saya pikir) github.com/magento/magento2/blob/develop/lib/internal/Magento/… yang menghidrasi entitas kerangka dengan data entitas yang dimuat ( langkah bagus dari Magento;))
David Verholen
2

Sebuah alternatif untuk Metode Beban Depresi Magento 2 adalah metode pemuatan model sumber daya.

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

di sini parameter pertama adalah objek model dan parameter kedua adalah id yang ingin Anda muat.

Sebuah alternatif untuk Magento 2 Deprecated Save Method adalah metode save model sumber daya.

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

metode save hanya menerima satu parameter yang merupakan objek model Anda.

chirag dodia
sumber