Zobaczmy najpierw, co się stanie, jeśli użyjesz save()
metody bezpośrednio na product
modelu takim jak
/**
* @var Magento\Catalog\Model\Product $product
*/
$product->save();
Sama klasa modeli to
Magento\Catalog\Model\Product
W ramach tej klasy wyszukaj definicję metody save ().
Nie znaleziono, prawda? Cóż, istnieją przedSave () i afterSave (), ale nie same save (). Ciekawe, nie?
Następnie musimy spojrzeć na klasy nadrzędne Magento\Catalog\Model\Product
.
Musimy przejść Magento\Catalog\Model\AbstractModel
i Magento\Framework\Model\AbstractExtensibleModel
, żeby w końcu dojść Magento\Framework\Model\AbstractModel
.
Rzeczywiście, tutaj jest metoda save () i wygląda ona mniej więcej tak
public function save()
{
$this->_getResource()->save($this);
return $this;
}
Widzimy teraz, za każdym razem, gdy save () jest wywoływane w dowolnym modelu, AbstractModel
wywoływana jest metoda save () z tego , a implementacja polega na tym, że MODEL RESOURCE faktycznie zapisuje.
Ten ostatni nie jest zaskakujący, biorąc pod uwagę, że zawsze tak jest, ponieważ, podobnie jak od początku czasu w Magento 1.0, tworzymy zarówno model, jak i model zasobów dla niemal każdego bytu.
Teraz przyjrzyjmy się, jak ProductRepository
działa.
Pozwala otworzyć plik
/vendor/magento/module-catalog/Api/ProductRepositoryInterface.php
Interfejs ten wymaga między innymi metody save ().
Kto faktycznie wdraża ten interfejs?
Pozwala otworzyć plik
/etc/di.xml
i sprawdź linię 10
<preference for="Magento\Catalog\Api\ProductRepositoryInterface" type="Magento\Catalog\Model\ProductRepository" />
Zatem naturalnie znajdujemy w sobie implantację metody save ()
/vendor/magento/module-catalog/Model/ProductRepository
i zaczyna się na linii 444, wyglądając jak
public function save(\Magento\Catalog\Api\Data\ProductInterface $product, $saveOptions = false)
{
$tierPrices = $product->getData('tier_price');
try {
.... other code here ....
Ta metoda oczekuje, że obiekt $ produktu zostanie \Magento\Catalog\Api\Data\ProductInterface
przekazany, ale domyślnie rozwiązuje to Magento\Catalog\Model\Product
.
Patrząc w dół na linię 500, w try
oświadczeniu widzimy coś takiego
$this->resourceModel->save($product);
Zgadłeś dobrze! $this->resourceModel
jest typu \Magento\Catalog\Model\ResourceModel\Product
, zadeklarowany jako protected
właściwość w wierszu 77.
Tak więc znowu ResourceModel
faktycznie oszczędza.
Ale między wierszem 444 a 500 jest tak naprawdę odpowiedzią na twoje pytanie. Cały kod tutaj wykonany, może ostatecznie i będzie prowadzić do różnic w zachowaniu między bezpośrednim zapisaniem modelu a tym sposobem zapisu w repozytorium.
Na przykład repozytorium produktów będzie pobierało i przetwarzało linki do produktów, jeśli ignore_links_flag
jest ustawione na 0
, sprawdź, czy jest to produkt istniejący, itp.
Prawdopodobnie musimy dojść do wniosku, że jeśli w przyszłości zaistnieje potrzeba zmiany sposobu zapisywania produktu, być może najlepszym sposobem na to jest zastąpienie repozytorium produktu zamiast modelu produktu.
To samo dotyczy zapisywania i aktualizowania produktów. Wolałbym użyć obiektu repozytorium produktów.
Uprzejmie odsyłam również do /vendor/magento/module-cms/Model/PageRepository.php
W ten sposób strona CMS byłaby zapisywana za pośrednictwem repozytorium. Tutaj rzeczy są prostsze. Identyfikator sklepu jest ustawiony, a model zasobów jest wywoływany w celu natychmiastowego zapisania.
Na podstawie tego ostatniego zawiadomienia dojdziesz do wniosku, że w niektórych przypadkach różnice między repozytorium a zapisem modelu mogą nie być zbyt duże, ale mam nadzieję, że masz teraz możliwość ich wykrycia, gdy tylko zajdzie taka potrzeba.