Wiem, że Magento 2 wprowadziło modele danych jako część architektury umowy serwisowej. Modele danych zwykle implementują interfejsy zdefiniowane w Api / Data / modułu.
Ale wydaje się, że Magento zachowało również stare modele.
Weźmy przykład do klienta-modułu.
- Interfejs modelu danych zdefiniowany w Api / Data / CustomerInterface.php
- Powyższy interfejs jest zaimplementowany w Model / Data / Customer.php
- Model danych ma wszystkie funkcje pobierania i ustawiania zmiennych klienta, zgodnie z oczekiwaniami
- Oprócz powyższego istnieje również Model / Customer.php. To także ma funkcję gettera i setera. To bardziej przypomina model Magento 1, który łączy się z ResourceModel (Model / ResourceModel / Customer.php)
- W Model / ResourceModel / CustomerRepository.php różne funkcje zbierają dane z modelu Magnento 1, przesyłają je do modelu danych, a następnie zwracają model danych.
Dlaczego potrzebny jest stary model? Dlaczego model danych nie może połączyć się bezpośrednio z ResourceModel?
źródło
\Magento\Customer\Api\Data\CustomerInterface
są dostępne dla interfejsu API REST / SOAP (jeśli jest włączony). Jednak nie potrzebujesz modelu danych, aby wybrać, które metody zostaną ujawnione, ponieważ zamiast tego możesz po prostu podłączyć interfejs do „rzeczywistego” modelu. Tak to się robi z\Magento\Catalog\Model\Product
i\Magento\Catalog\Api\Data\ProductInterface
Dodając do odpowiedzi @ Phoenix128_RiccardoT, warto zauważyć, że repozytoria (tj.
MagentoCms\Api\BlockRepository
LubMagento\Customer\Api\CustomerRepositoryInterface
) również oczekują, że dostarczysz model danych, a nie zwykły. Modele danych są warstwą abstrakcji w porównaniu ze standardowymi modelami, która udostępnia tylko dane dostarczone przez jednostkę. Wszystkie „działania” dotyczące tych danych są przenoszone gdzie indziej.Wygląda trochę jak idea encji w Symfony2 i Symfony3, gdzie encje zawierają tylko dane, a każda manipulacja danymi odbywa się w menedżerze encji. Wierzę, że w Magento2 rolę tę powierzono repozytoriom.
Stare modele są nadal z nami, ponieważ sposób, w jaki opracowano Magento2. Najwyraźniej nie zaczęli od pustego pliku index.php, ale ponownie użyli kodu z M1. Gdy spojrzeć na standardowych metod modelowych (
load()
,save()
, idelete()
) wszystkie są oznaczonedeprecated
. Dzieje się tak, ponieważ to zadanie jest przenoszone do repozytoriów (oczywiście w niektórych przypadkach całe repozytorium obecnie wywołuje tę zwykłąsave()
metodę modelową , ale droga wydaje mi się jasna).źródło
Modele zawierają logikę biznesową niezależną od pamięci, nie wiedzą o silnikach baz danych ani instancjach, w Magento 2 Modele danych to Obiekty Transferu Danych (DTO), implementacja specyficznych interfejsów DTO (model danych) dla modeli Magento CRUD (model ) określa, które metody klas są dostępne za pośrednictwem interfejsu API Magento WebAPI.
Model/Data/Customer.php
określa, które metody są dostępne dla interfejsu API, podczas gdyModel/Customer.php
ma starszą implementację niestandardowych programów pobierających i ustawiających typu Magento 1 dostępnych dla operacji innych niż API.Model/ResourceModel/CustomerRepository.php
jest częścią nowej funkcji wprowadzonej w Magento 2 - Umowy serwisowe, współpracuje z kombinacją DTO (modele danych).Ponieważ wiemy, że Magento ORM składa się z modeli, modeli zasobów i kolekcji i zależy od bazy danych, celem umowy serwisowej jest ukrycie logiki pamięci, aby klient podłączony do repozytorium (umowa serwisowa) nie dbał o pamięć docelową silnik.
źródło