抽象模型中不建议使用的保存和加载方法


57

我看到,在Magento的2回购的开发分支的方法load,并saveMagento\Framework\Model\AbstractModel阶级已被弃用。
但是核心中有大量的类可以扩展这个类并使用saveload
在为实体的CRUD部分创建自己的模块时,我遵循与核心模块相同的准则。
但是,由于不赞成使用这些方法,所以我宁愿为将来做准备。
我应该用什么代替它们?还是我应该扩展其他内容?


这些方法现在不推荐使用吗?
Knight017

1
如果现在你的意思是2.3,是的,他们是:github.com/magento/magento2/blob/2.3/lib/internal/Magento/...
马吕斯

Answers:


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仍然使用了实现。我应该为模块使用资源模型而不是此方法吗?loadgetgetByIdload
马里斯(Marius)

2
是的,为了让您的模块更好地在模块SL中使用ResourceModel
KAndy,2016年

6
您能否提供一些示例代码以说明我们如何使用ResourceModel
Yogesh Karodiya,2016年

1
你有什么例子吗?我查看了官方评论和新闻通讯模块,它们直接称为“保存”。我找不到使用ResourceModel的示例。我已经为我的模块定义了它,但是如何使用它呢?
贾尼斯·埃默里斯(JānisElmeris)'11

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文件是迭代器?

那是一段前一段时间发生的对话(是Alan Storm提到过它吗?不记得了),所以我不确定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)

不幸的是,@ 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/magento2/ blob / develop / lib / internal / Magento /…执行ReadMain操作(我认为)github.com/magento/magento2/blob/develop/lib/internal/Magento / ...它将骨架实体与已加载的实体数据混合(来自Magento的好举动;))
David Verholen


2

Magento 2不推荐使用的加载方法的替代方法是资源模型加载方法。

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

在这里,第一个参数是模型对象,第二个参数是要加载的ID。

Magento 2不建议使用的保存方法的替代方法是资源模型保存方法。

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

save方法仅接受作为模型对象的一个​​参数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.