Rozumiem, że preferowanym sposobem pracy między modułami w Magento 2 jest korzystanie z umów serwisowych.
Więc jeśli chcę załadować produkt, korzystam z repozytorium produktów:
$product = $productRepository->getById($id);
czyli na podstawie umowy zwracającej instancję Magento\Catalog\Api\Data\ProductInterface
.
Ale zamiast tego mógłbym również użyć starego sposobu, wywołując bezpośrednio warstwę domeny:
$product = $productFactory->create()->load($id);
Czy jest jakiś przypadek, w którym byłoby to konieczne lub przydatne?
Devdocs mówią (wyróżnienie dodane):
Moduł może bezpośrednio wywoływać inny moduł. To ściśle powiązane rozwiązanie nie jest zalecane w większości sytuacji, ale czasami jest nieuniknione .
[...]
Twoja strategia wywoływania kodu warstwy domeny innego modułu jest wysoce zależna od unikalnej konfiguracji i potrzeb twojego systemu.
Źródło: http://devdocs.magento.com/guides/v2.0/architecture/archi_perspectives/domain_layer.html
A komentarz do powiązanego pytania brzmiał:
użycie repozytorium da model danych produktu (
Api/Data/Product
), który jest modelem produktu przekonwertowanym na głupi DTO. Coś do rozważenia, ponieważ są one zupełnie różne
Ale o ile widzę, obiekty są takie same w normalnych warunkach, tylko typy zwracane na phpDoc różnią się ( Magento\Catalog\Api\Data\ProductInterface
/ Magento\Catalog\Model\Product
)
źródło
But I could also use the old way instead, calling the domain layer directly: (use factory). Is there any case where this would be necessary or useful?
. Tak: gdy trzeba wywołać metodę modelu , a nie metodęApi/Data/Product
. Czy to jest lepsze? :)Dla mnie nie ma powodu, aby używać
load
metody zamiast metodygetById
/get
.Nie mówię, że mam rację, ale oto, jak widzę różne rzeczy.
Ok, więc oto
getById
metoda (get
metoda jest podobna, ale używa sku zamiast id):Jak widać wklejony kod:
Jest częścią tej funkcji.
Jednak dodatkowy warunek używa buforowanych instancji, aby uniknąć dodatkowego przeładowania w przypadku, gdy wcześniej używałeś metody
getById
lubget
dla tego samego identyfikatora (lub SKU w przypadkuget
metody) .Możesz myśleć, że to dobry powód do użytku
load
może być do uniknięcia stosowania tych buforowane instancji (w tym przypadku to może być dobry powód? Że nie wiem), alegetById
i teget
metody mają$forceReload
parametr, który może być ustawiony na true, aby unikaj używania tych instancji pamięci podręcznej.Dlatego dla mnie nie ma żadnego powodu, aby używać
load
metodygetById
lubget
metod.źródło
Proszę zrozumieć różnicę między repozytoriami a kolekcjami.
W twoim przykładzie, jeśli używasz repozytoriów, otrzymasz tablicę,
Magento\Catalog\Api\Data\ProductInterface
która różni się od pobierania kolekcjiMagento\Catalog\Model\Product
.Repozytoria i interfejs danych zapewniają wysoki poziom interfejsu, który powinien być zagwarantowany jako kompatybilny w przyszłych wersjach . Właśnie dlatego jest to sugerowane podejście.
Mam nadzieję, że to pomoże.
źródło