我正在尝试构建一个包含Magento 2中的EAV实体的自定义模块,用于学习目的
我从管理员控制器执行适当的保存时遇到了麻烦。
我试图避免代码:
$data = get data from post here;
$myObj->addData($data)->save();
因为不推荐使用保存方法,因为我正在尝试使用接口而不是其实现.
对于一个扁平的实体,我可以这样做:
$entity = either get it from a repository or via factory;
$data = get data from post
$this->dataObjectHelper->populateWithArray($entity, $data, EntityInterface::class);
哪里有
dataObjectHelper
是
\Magento\Framework\Api\DataObjectHelper
的一个例子
读取作为第3个参数传递的接口的setter,并将相应的映射到
$data
中的方法
数组到我的实体.
所以如果是
$data
看起来像这样:
$data = [
'title'=>'Some title',
'description' => 'Some description'
]
只会打电话给
$entity->setTitle('Some title')->setDescription('Some description')
.
但我无法为EAV实体做到这一点,因为我的实体界面将只包含系统属性而不包含自定义属性.
我需要从POST获取数据并将其传递给
$entity
实例然后调用
$entityRepository->save($entity)
但我不想失去任何自定义属性.
在这种情况下如何处理?
我看了核心,控制器仍然称之为
$entity->save()
的产品和类别
哪个不行.
最新回答
- 2019-12-51 #
- 2019-12-52 #
如何像往常一样填充数据,但使用资源执行保存。
至少我现在正在解决弃用问题。
所以,根据我的理解, Magento 2 is slowly switching to the EntityManager which is used to extract and hydrate the entities.
填充数据要填充数据,您需要使用保湿剂
保存实体\Magento\Framework\EntityManager\Hydrator
:这已经在2.1中实现了一半.让我们来看看产品资源模型
save()
方法:这是正确的做法.唯一没有实现的是,它仍然是通过
save()
来实现的 调用因为已弃用的方法仍然调用$this->_getResource()->save($this);