Magento 2中使用存储库和工厂?

阅读了Magento 2中的一些教程,这让我有些困惑。我可以看到基本上有两种方法可以读取/写入业务实体:

检索数据

使用工厂方法

$object = $this->myFactory->create();
$object->load($myId);

使用存储库方法

$repo   = $this->myRepository();
$object = $repo->getById($myId);

保存数据

使用工厂方法

$object = $this->myFactory->create();
$object->load($myId);
$object->setData('something', 'somethingDifferent')->save();

使用存储库方法

$repo   = $this->myRepository();
$object = $repo->getById($myId);
$object->setData('something', 'somethingDifferent');
$repo->save($object);

我还看到,可以使用依赖项注入来注入存储库和工厂类。至少对我来说这令人困惑。

我们什么时候应该使用存储库方法和工厂方法?我们需要遵循的最佳实践是什么?

如果有一个存储库并且它可以很好地满足您的需求,请始终选择该存储库。

存储库是服务合同的一部分(它们是中的接口的实现Api),这意味着它们被视为与其他模块的公共接口。

使用存储库进行完全加载

$model->load()不属于服务合同的一部分。我对该特定主题有疑问,您可能会找到有用的答案:是否有理由比服务合同更喜欢$ model-> load()?

使用工厂创建新实体

存储库不带有创建新实体的方法,因此在这种情况下,您将需要一个工厂。但是将工厂用于接口,例如Magento\Catalog\Api\Data\ProductInterfaceFactory-它将基于DI配置创建正确的实现。

然后使用该repository->save()方法保存它。

如果需要更多控制权,请使用收集工厂

以下不是官方的Magento最佳做法,但目前,存储库无法很好地控制要加载的内容。搜索条件API允许您定义过滤器,但是例如,无法选择特定的EAV属性或指定要联接的索引表。

这些是实现细节,对服务合同API而言是隐藏的,但是这些实现细节通常很重要,如果忽略它们,将会导致性能下降。因此,一旦存储库限制了我,我便会毫不犹豫地使用基础集合

相关文章

0 0 投票数
文章评分
订阅评论
提醒
0 评论
最旧
最新 最多投票
内联反馈
查看所有评论