Je suis conscient que Magento 2 a introduit des modèles de données dans le cadre de l'architecture du contrat de service. Les modèles de données implémentent généralement des interfaces définies dans Api / Data / d'un module.
Mais Magento semble également avoir conservé les anciens modèles.
Prenons un exemple pour module-client.
- Interface de modèle de données définie dans Api / Data / CustomerInterface.php
- L'interface ci-dessus est implémentée dans Model / Data / Customer.php
- Le modèle de données a toutes les fonctions getter et setter pour les variables client, comme on pourrait s'y attendre
- En plus de ce qui précède, il existe également un Model / Customer.php. Cela a aussi la fonction getter et setter. Cela ressemble plus à un modèle Magento 1 qui se connecte au ResourceModel (Model / ResourceModel / Customer.php)
- Dans Model / ResourceModel / CustomerRepository.php, diverses fonctions collectent les données du modèle Magnento 1, les transfèrent vers le modèle de données, puis renvoient le modèle de données.
Pourquoi a-t-on besoin de l'ancien modèle? Pourquoi le modèle de données ne peut-il pas se connecter directement au ResourceModel?
la source
\Magento\Customer\Api\Data\CustomerInterface
sont exposées pour l'API REST / SOAP (si activée). Cependant, vous n'avez pas besoin d'un modèle de données pour sélectionner les méthodes à exposer, car vous pouvez simplement connecter l'interface au modèle «réel» à la place. C'est comme ça que ça se passe avec\Magento\Catalog\Model\Product
et\Magento\Catalog\Api\Data\ProductInterface
En ajoutant à la réponse @ Phoenix128_RiccardoT, il convient de noter que les référentiels (c.-à-d.
MagentoCms\Api\BlockRepository
OuMagento\Customer\Api\CustomerRepositoryInterface
) s'attendent également à ce que vous fournissiez un modèle de données et non un modèle régulier. Les modèles de données sont une couche d'abstraction sur les modèles standard qui expose uniquement les données fournies par l'entité. Toutes les "actions" sur ces données sont déplacées ailleurs.Cela ressemble un peu à l'idée d'entité dans Symfony2 et Symfony3 où les entités ne contiennent que des données et toute manipulation de données a lieu dans le gestionnaire d'entités. Dans Magento2, ce rôle, je crois, a été confié aux référentiels.
Les anciens modèles sont toujours avec nous car ils ont développé magento2. Ils ne sont évidemment pas partis d'un index.php vide mais ont réutilisé du code de M1. Lorsque vous jetez un oeil à des méthodes de modèle standard (
load()
,save()
etdelete()
) tous sont marqués commedeprecated
. C'est parce que ce travail est déplacé vers des référentiels (étant entendu que dans certains cas, tout le référentiel appelle maintenant cettesave()
méthode de modèle standard, mais la route me semble claire).la source
Les modèles encapsulent la logique métier indépendante du stockage, ils ne connaissent pas les moteurs ou les instances de base de données, dans Magento 2 les modèles de données sont des objets de transfert de données (DTO), la mise en œuvre des interfaces spécifiques DTO (modèle de données) pour les modèles Magento CRUD (le modèle ) détermine les méthodes de classe disponibles via Magento WebAPI.
Model/Data/Customer.php
détermine les méthodes disponibles pour l'API, tandis que l'Model/Customer.php
implémentation héritée de type Magento 1 de getters et setters personnalisés est disponible pour les opérations non-API.Model/ResourceModel/CustomerRepository.php
fait partie d'une nouvelle fonctionnalité introduite dans Magento 2 - Contrats de service, il fonctionne avec la combinaison de DTO (Data Models).Comme nous savons que Magento ORM se compose des modèles, des modèles de ressources et des collections et dépend de la base de données, le but d'un contrat de service est de masquer la logique de stockage afin qu'un client connecté au référentiel (contrat de service) ne se soucie pas du stockage cible. moteur.
la source