Застарілі методи збереження та завантаження в абстрактній моделі


57

Я бачу, що у розробці гілки Magento 2 repo методи loadта saveз Magento\Framework\Model\AbstractModelкласу застарілі.
Але в ядрі є газильйонні класи, які розширюють цей клас та використовують saveі load.
Створюючи власний модуль для CRUD частини моїх сутностей, я дотримуюся тих же рекомендацій, що і основний модуль.
Але оскільки ці методи застарілі, я радше буду готовий до майбутнього.
Що я повинен використовувати замість них? Або я повинен продовжити щось інше?


Чи застаріли ці методи зараз?
Knight017

1
Якщо ви маєте на увазі 2.3, так, це: github.com/magento/magento2/blob/2.3/lib/internal/Magento/…
Маріус

Відповіді:


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

Якщо контракт на обслуговування модуля недоступний, ви можете використовувати ResourceModel для збереження об'єктів.


Я бачу. Це має сенс. Але чи можете ви підтвердити, що всі основні модулі CRUD будуть мати договори на обслуговування в один момент?
Маріус

1
Я бачу, що реалізація ProductRepositoryInterfaceвсе ж використовує loadв методах getі getById. Чи слід використовувати модель ресурсу для свого модуля замість цього loadметоду?
Маріус

2
так, для вашого модуля краще використовувати ResourceModel у своєму модулі SL
KAndy,

6
Ви можете, будь ласка, надати приклад коду того, як ми можемо використовувати ResourceModel
Йогеш Кародія

1
Чи є у вас приклади? Я переглянув офіційні модулі огляду та інформаційних бюлетенів, і вони закликають "зберегти" безпосередньо. Я не можу знайти приклад використання ResourceModel. У мене це визначено для мого модуля, але як ним користуватися?
Jānis Elmeris

24

З того, що я зрозумів, що відбудеться, це те, що Magento збирається перейти на гідрататори extract()та hydrate()методи.

Це посилання раніше працювало, але, схоже, команда Magento повернула його назад: https://github.com/magento/magento2/blob/develop/lib/internal/Magento/Framework/Model/Entity/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файли ітератори?

Це була розмова, яка відбулася деякий час тому (чи це згадував Алан Шторм? Не можу згадати), тож я не впевнений, що команда Magento все ще йде таким шляхом.

Оновлення

З мого дослідження, внутрішній квиток на Magento щодо цієї зміни - MAGETWO-50676, ось відповідні зобов'язання, які мені вдалося знайти:

Мабуть, більше TBH, але мені не здається, що я переглядаю всю репо-файлу для передачі повідомлень

Якщо ви не знайомі з гідрататорами, пропоную перевірити це посилання: http://www.webconsults.eu/blog/entry/108-What_is_a_Hydrator_in_Zend_Framework_2

Оновлення з 2.1

Magento тепер використовує EntityManagerклас для заміни спадщини, ви можете знайти більше інформації тут: Magento 2.1: використання менеджера сутності


1
Гаразд. Хороша теорія. Але я міг би використати приклад із ядра. Вибачте, але мої навички magento відновили копіювання / вставлення / заміну :). Ви згадали файли дій та послідовності. Чи можете ви бути більш конкретними?
Маріус

@Marius, на жаль, це все, що я знаю. Я не можу пригадати, звідки я взяв цю інформацію, але в той час планувалося використовувати саме цю команду : github.com/magento/magento2/tree/… для здійснення переходу з load()/save()гідрататорів. Я припускаю, що Sequencesпрацює як ітератори, і Actionsце дії CRUD
Рафаель у Digital Pianism

4
ви знайдете приклад у поточному методі завантаження моделі ресурсу cms: github.com/magento/magento2/blob/develop/app/code/Magento/Cms/… Він використовує сутністьManager-> load github.com/magento/magento2/ blob / development / lib / Internal / Magento /…, який виконує операцію ReadMain (я думаю) github.com/magento/magento2/blob/develop/lib/internal/Magento/…, яка зволожує сутність скелета із завантаженими даними сутності ( приємний хід від Магенто;))
Девід Верхолен


2

Альтернативою методу застарілого завантаження Magento 2 є метод завантаження моделі ресурсів.

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

тут перший параметр є об'єктом моделі, а другий параметр - ідентифікатором, який ви хочете завантажити.

Альтернативою застарілому методу збереження Magento 2 є метод збереження моделі ресурсів.

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

метод збереження приймає лише один параметр, який є об'єктом вашої моделі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.