Устаревшие методы сохранения и загрузки в абстрактной модели

57

Я вижу , что в разработке ветви Magento 2 репо методы loadи saveиз Magento\Framework\Model\AbstractModelкласса устарели.
Но в ядре есть gazillion классов, которые расширяют этот класс и используют saveи load.
При создании моего собственного модуля для CRUD-части моих сущностей я следую тем же рекомендациям, что и основной модуль.
Но так как эти методы устарели, я предпочел бы быть готовым к будущему.
Что я должен использовать вместо них? Или я должен расширить что-то еще?

Мариус
источник
Эти методы не рекомендуются сейчас?
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);
}

Если договор на обслуживание модуля недоступен, вы можете использовать ResourceModel для сохранения сущностей.

Канди
источник
Понимаю. Это имеет смысл. Но можете ли вы подтвердить, что все основные модули CRUD будут иметь сервисные контракты в один момент?
Мариус
1
Я вижу, что реализация ProductRepositoryInterfaceвсе еще использует loadметоды getи getById. Должен ли я использовать модель ресурсов для моего модуля вместо этого loadметода?
Мариус
2
да, для вашего модуля лучше использовать ResourceModel в вашем модуле SL
KAndy
6
Можете ли
1
У вас есть примеры? Я посмотрел на официальные модули обзора и рассылки, и они вызывают «сохранить» напрямую. Я не могу найти пример использования ResourceModel. Я определил его для моего модуля, но как его использовать?
Янис Элмерис
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 возобновляются, чтобы копировать / вставлять / заменять :). Вы упомянули файлы действий и последовательностей. Можете быть более конкретными?
Мариус
@ Мариус, к сожалению, это все, что я знаю. Я не могу вспомнить, откуда я получил эту информацию, но в то время планировалось использовать этот конкретный коммит: github.com/magento/magento2/tree/… чтобы осуществить переход от load()/save()гидраторов. Я предполагаю, что Sequencesработают как итераторы и Actionsявляются действиями CRUD
Рафаэль в Digital Pianism
4
Вы найдете пример в текущем методе загрузки модели ресурсов блока cms: github.com/magento/magento2/blob/develop/app/code/Magento/Cms/… Он использует entityManager-> load github.com/magento/magento2/ blob / develop / lib / internal / Magento /… которая выполняет операцию ReadMain (я думаю) github.com/magento/magento2/blob/develop/lib/internal/Magento/…, которая гидратирует скелетную сущность с загруженными данными сущности ( Хороший переезд из Magento;))
Дэвид Верхолен
2

Альтернативой Magento 2 Deprecated Load Method является метод загрузки модели ресурсов.

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

Метод save принимает только один параметр, который является объектом вашей модели.

Чираг Додиа
источник