Magento 2:模型与数据模型之间的差异


13

我知道Magento 2引入了数据模型作为服务合同体系结构的一部分。数据模型通常实现在模块的Api / Data /中定义的接口。

但是,Magento似乎也保留了旧模型。

让我们以模块客户为例。

  • 在Api / Data / CustomerInterface.php中定义的数据模型接口
  • 上面的接口在Model / Data / Customer.php中实现
  • 数据模型具有客户变量的所有getter和setter函数,正如人们所期望的那样
  • 除上述内容外,还有一个Model / Customer.php。这也具有getter和setter功能。这更像是连接到ResourceModel(Model / ResourceModel / Customer.php)的Magento 1模型。
  • 在Model / ResourceModel / CustomerRepository.php中,各种函数从Magnento 1模型收集数据,将它们传输到数据模型,然后返回数据模型。

为什么需要旧模型?为什么数据模型不能直接与ResourceModel连接?

Answers:


7

我的解释:

很难理解模型和数据模型之间的区别。如果我不得不说几句话,我可以说一个模型代表引擎,一个数据模型代表它的信息

在您的示例中,通过客户实体,您可以看到例如方法authenticate或方法如何validatePassword保留在客户模型中,因为它们是引擎的一部分,并且它们不会直接处理信息。另一方面,类似的方法getExtensionAttributes(因为处理信息)保留在数据模型中。

我认为这只是更好的项目处理方式,就像模型和资源模型之间的划分一样,您可能会问为什么同样需要它们。

为什么需要它们:

例如,如果您想使用API​​公开客户信息,则需要一个具有getter接口\Magento\Customer\Api\Data\CustomerInterface)来定义实体的所有属性,并且如果您有其他getter方法不代表您想要公开的信息(例如:), 你有问题!getRandomConfirmationKey

在我的示例中,这就是为什么它getRandomConfirmationKey是模型(\Magento\Customer\Model\Customer)的getFirstname一部分,而又是数据模型的一部分的原因。

一个快速的规则可能是:

  • 如果您的方法表示表列,任何类型的属性或实体信息,则应进入数据模型
  • 如果您的方法是对该信息的“操作”,则它会处理该信息,或者您在webapi.xml中声明它,那么它应该是模型方法。

开机自检:

简而言之:将数据模型几乎视为DTO。


\Magento\Customer\Api\Data\CustomerInterface公开了REST / SOAP API(如果启用)中的所有方法。但是,您不需要数据模型来选择公开哪些方法,因为您只需将接口连接到“真实”模型即可。这就是它的与做的方式\Magento\Catalog\Model\Product\Magento\Catalog\Api\Data\ProductInterface
米兰西梅克

2

除了@ Phoenix128_RiccardoT答案外,值得注意的是,存储库(即MagentoCms\Api\BlockRepositoryMagento\Customer\Api\CustomerRepositoryInterface)也期望您将提供数据模型而不是常规模型。数据模型是标准模型之上的抽象层,仅公开实体提供的数据。此数据上的所有“操作”都移至其他位置。

看起来有点像Symfony2和Symfony3中的实体概念,其中实体仅包含数据,并且任何数据操纵都在实体管理器中进行。我相信,在Magento2中,该角色被赋予了存储库。

旧模型仍然存在,因为它们以magento2的方式开发。他们显然不是从空白的index.php开始,而是重用了M1的一些代码。当你看看标准模型的方法(load()save(),和delete())都被标记为deprecated。这是因为该工作已移至存储库(当然,在某些情况下,所有存储库现在都在调用此常规模型save()方法,但对我来说这条路似乎很清楚)。


1
产品数据模型又如何呢?没有产品数据模型
sivakumar

2

模型封装了独立于存储的业务逻辑,它们不了解数据库引擎或实例,在Magento 2中,数据模型是数据传输对象(DTO),Magento CRUD模型(该模型的DTO(数据模型)专用接口的实现) )确定可通过Magento WebAPI使用哪些类方法。

Model/Data/Customer.php确定哪些方法可用于API,而Model/Customer.php自定义getter和setter的传统Magento 1类型实现可用于非API操作。

Model/ResourceModel/CustomerRepository.php 是Magento 2-服务合同中引入的新功能的一部分,可与DTO(数据模型)结合使用。

众所周知,Magento ORM由模型,资源模型和集合组成,并依赖于数据库,因此服务合同的目的是隐藏存储逻辑,因此连接到存储库(服务合同)的客户端不必关心目标存储发动机。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.