我看到,在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
仍然使用了实现。我应该为模块使用资源模型而不是此方法吗?load
get
getById
load
据我了解,将会发生的是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:使用实体管理器
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方法仅接受作为模型对象的一个参数。