阅读了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而言是隐藏的,但是这些实现细节通常很重要,如果忽略它们,将会导致性能下降。因此,一旦存储库限制了我,我便会毫不犹豫地使用基础集合