首页>Magento>source

我正在尝试构建一个包含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-5
    1 #

    所以,根据我的理解, Magento 2 is slowly switching to the EntityManager which is used to extract and hydrate the entities.

    填充数据

    要填充数据,您需要使用保湿剂 \Magento\Framework\EntityManager\Hydrator   :

    $entity = $this->hydrator->hydrate($entity, $dataArray);
    
    保存实体

    这已经在2.1中实现了一半.让我们来看看产品资源模型 save()   方法:

    public function save(\Magento\Framework\Model\AbstractModel $object)
    {
        $this->getEntityManager()->save($object);
        return $this;
    }
    

    这是正确的做法.唯一没有实现的是,它仍然是通过 save()来实现的   调用因为已弃用的方法仍然调用 $this->_getResource()->save($this);

  • 2019-12-5
    2 #

    如何像往常一样填充数据,但使用资源执行保存。

    至少我现在正在解决弃用问题。

相关问题

  • magento2:Magento 2重新索引 - 一个或多个索引器无效确保您的Magento cron作业正在运行
  • Magento Reports:Magento Reports - 产品 - 产品订购问题