Давайте спочатку розберемося, що станеться, якщо використовувати save()
метод безпосередньо на product
подібній моделі
/**
* @var Magento\Catalog\Model\Product $product
*/
$product->save();
Сам клас моделі є
Magento\Catalog\Model\Product
У межах цього класу знайдіть визначення методу save ().
Не знайдено правильно? Що ж, є ранішеSave () та afterSave (), але не зберегти (). Цікаво, ні?
Потім нам потрібно переглянути батьківські класи Magento\Catalog\Model\Product
.
Нам потрібно пройти Magento\Catalog\Model\AbstractModel
і Magento\Framework\Model\AbstractExtensibleModel
, щоб нарешті приїхати Magento\Framework\Model\AbstractModel
.
Звичайно, тут є метод save (), і це виглядає приблизно так
public function save()
{
$this->_getResource()->save($this);
return $this;
}
Ми бачимо, щоразу, коли виклик save () на будь-якій моделі AbstractModel
викликається, метод save () викликається, і реалізація полягає в тому, що РЕЗУЛЬТАТНА МОДЕЛЬ дійсно робить економію.
Останнє не дивно, враховуючи, що ми завжди, оскільки, як і з початком часу в Magento 1.0, створюємо як модель, так і модель ресурсу майже для будь-якої сутності.
Тепер давайте подивимось, як це ProductRepository
працює.
Дозволяє відкрити файл
/vendor/magento/module-catalog/Api/ProductRepositoryInterface.php
Цей інтерфейс вимагає, щоб серед інших методів існував метод save ().
Хто реально реалізує цей інтерфейс?
Дозволяє відкрити файл
/etc/di.xml
і перевірити рядок 10
<preference for="Magento\Catalog\Api\ProductRepositoryInterface" type="Magento\Catalog\Model\ProductRepository" />
Отже, ми, природно, знаходимо реалізацію збереження () ментоду всередині
/vendor/magento/module-catalog/Model/ProductRepository
і він починається на лінії 444, виглядаючи щось подібне
public function save(\Magento\Catalog\Api\Data\ProductInterface $product, $saveOptions = false)
{
$tierPrices = $product->getData('tier_price');
try {
.... other code here ....
Цей метод очікує, що $ об'єкт продукту типу \Magento\Catalog\Api\Data\ProductInterface
переданий, але за замовчуванням це вирішує значення Magento\Catalog\Model\Product
.
Дивлячись нижче на лінію 500, перемагаючи try
заяву, ми бачимо щось на кшталт
$this->resourceModel->save($product);
Ви добре здогадалися! $this->resourceModel
типу \Magento\Catalog\Model\ResourceModel\Product
, оголошений як protected
властивість по лінії 77.
Отже, знову ж таки, ResourceModel
насправді це економія.
Але між рядком 444 і 500 насправді є відповіддю на ваше запитання. Весь код, виконаний тут, справді, зрештою, може і призведе до відмінностей у поведінці між прямим збереженням моделі та цим способом збереження сховища.
Наприклад, сховище продукту отримає та обробить посилання на продукти, якщо ignore_links_flag
встановлено значення 0
, перевірте, чи в першу чергу це вже існуючий продукт тощо.
Напевно, нам потрібно зробити висновок, що якщо в майбутньому виникне потреба змінити спосіб збереження продукту, можливо, кращий спосіб зробити це шляхом переопределення продуктового сховища замість моделі продукту.
Те саме стосується збереження та оновлення продуктів. Я вважаю за краще використовувати об'єкт продуктового сховища.
Я також люб'язно посилаюся на вас на /vendor/magento/module-cms/Model/PageRepository.php
Так зберігається CMS-сторінка через сховище. Тут все простіше. Встановлюється ідентифікатор магазину, а модель ресурсу викликається для збереження відразу.
За допомогою цього останнього повідомлення ви зробите висновок, що в деяких випадках може бути не так багато відмінностей між сховищем та збереженням моделі, але все одно я сподіваюся, що ви зараз готові помітити їх, коли вам потрібно це зробити.