Magento 2:モデルとデータモデルの違い


13

Magento 2がサービスコントラクトアーキテクチャの一部としてデータモデルを導入したことは承知しています。データモデルは通常、モジュールのApi / Data /で定義されたインターフェイスを実装します。

しかし、Magentoは古いモデルも保持しているようです。

モジュール顧客の例を見てみましょう。

  • Api / Data / CustomerInterface.phpで定義されたデータモデルインターフェイス
  • 上記のインターフェースはModel / Data / Customer.phpに実装されています
  • データモデルには、顧客変数のすべてのゲッター関数とセッター関数があります。
  • 上記に加えて、Model / Customer.phpもあります。これにはゲッターとセッターの機能もあります。これは、ResourceModel(Model / ResourceModel / Customer.php)に接続するMagento 1モデルに似ています。
  • Model / ResourceModel / CustomerRepository.phpでは、さまざまな関数がMagnento 1モデルからデータを収集し、それらをデータモデルに転送してから、データモデルを返します。

なぜ古いモデルが必要なのですか?データモデルがResourceModelに直接接続できないのはなぜですか?

回答:


7

私の説明:

モデルとデータモデルの違いを理解することは非常に困難です。簡単に言えば、モデルはエンジンを表し、データモデルはその情報を表すと言えます。

あなたの例では、顧客のエンティティで、あなたはどのようにする方法の例を参照することができますauthenticateかはvalidatePassword、彼らはの一部であるため、顧客のモデルに保管されているエンジンと、彼らが直接情報を処理するつもりはありません。一方、次のようなメソッドgetExtensionAttributes情報の処理はデータモデル内に保持されるためがあります。

モデルとリソースモデルの区分のように、これはプロジェクトの処理の改善にすぎないと思うので、なぜそれらが必要なのかを尋ねることができます。

それらが必要な理由:

APIを使用して顧客情報を公開する場合(たとえば)、エンティティのすべての属性を定義するゲッターを含むインターフェイス\Magento\Customer\Api\Data\CustomerInterface)が必要です。公開する情報を表さない他のゲッターメソッドがある場合(例:)、問題があります!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
ミラノSimek

2

@ Phoenix128_RiccardoTの回答に加えて、注目に値するのは、リポジトリ(MagentoCms\Api\BlockRepositoryまたはMagento\Customer\Api\CustomerRepositoryInterface)が通常のモデルではなくデータモデルを提供することを期待していることです。データモデルは、エンティティが提供するデータのみを公開する標準モデルの抽象化レイヤーです。このデータに対するすべての「アクション」は他の場所に移動されます。

Symfony2およびSymfony3のエンティティの概念に少し似ており、エンティティにはデータのみが含まれ、エンティティマネージャでデータ操作が行われます。Magento2では、この役割はリポジトリに与えられたと思います。

magento2が開発された方法であるため、古いモデルはまだ残っています。明らかに空のindex.phpからではなく、M1のコードを再利用しました。あなたは、標準モデルのメソッドを見てみたとき(load()save()、およびdelete())すべてとしてマークされていますdeprecated。これは、そのジョブがリポジトリに移動されるためです(一部のケースでは、すべてのリポジトリがこの通常のモデルsave()メソッドを呼び出しているが、道ははっきりしているようです)。


1
製品データモデルについてはどうですか。製品データモデルはありません
sivakumar

2

モデルはストレージに依存しないビジネスロジックをカプセル化し、データベースエンジンまたはインスタンスを認識しません。Magento2 データモデルはデータ転送オブジェクト(DTO)、Magento CRUDモデル(モデル)のDTO(データモデル)固有のインターフェイスの実装です)Magento WebAPIを介して利用可能なクラスメソッドを決定します。

Model/Data/Customer.phpAPIで使用できるメソッドを決定しますが、API Model/Customer.php以外の操作で使用できるカスタムゲッターおよびセッターの従来のMagento 1タイプの実装があります。

Model/ResourceModel/CustomerRepository.php Magento 2-サービス契約で導入された新機能の一部であり、DTO(データモデル)の組み合わせで動作します。

Magento ORMはモデル、リソースモデル、およびコレクションで構成され、データベースに依存することがわかっているため、サービスコントラクトの目的は、ストレージロジック(サービスコントラクト)に接続しているクライアントがターゲットストレージを気にしないようにストレージロジックを非表示にすることですエンジン。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.