我看到,在Magento的2回购的开发分支的方法load,并save从Magento\Framework\Model\AbstractModel阶级已被弃用。
但是核心中有大量的类可以扩展这个类并使用save和load。
在为实体的CRUD部分创建自己的模块时,我遵循与核心模块相同的准则。
但是,由于不赞成使用这些方法,所以我宁愿为将来做准备。
我应该用什么代替它们?还是我应该扩展其他内容?
我看到,在Magento的2回购的开发分支的方法load,并save从Magento\Framework\Model\AbstractModel阶级已被弃用。
但是核心中有大量的类可以扩展这个类并使用save和load。
在为实体的CRUD部分创建自己的模块时,我遵循与核心模块相同的准则。
但是,由于不赞成使用这些方法,所以我宁愿为将来做准备。
我应该用什么代替它们?还是我应该扩展其他内容?
Answers:
您应该使用模块服务合同。
例如,对于产品,您应该使用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保存实体。
ProductRepositoryInterface仍然使用了实现。我应该为模块使用资源模型而不是此方法吗?loadgetgetByIdload
                    据我了解,将会发生的是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.phpEntityMetadata.phpHydratorInterface.phpMetadataPool.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:使用实体管理器
load()/save()。我假设Sequences工作就像迭代器一样,并且Actions是CRUD动作
                    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方法仅接受作为模型对象的一个参数。