Mari kita lihat dulu, apa yang terjadi jika Anda menggunakan save()
metode langsung pada product
model seperti
/**
* @var Magento\Catalog\Model\Product $product
*/
$product->save();
Kelas model itu sendiri
Magento\Catalog\Model\Product
Di dalam kelas ini, cari definisi metode save ().
Tidak ada yang ditemukan? Nah, ada beforeSave () dan afterSave (), tetapi tidak menyimpan () sendiri. Menarik, bukan?
Kemudian, kita perlu melihat kelas induk dari Magento\Catalog\Model\Product
.
Kita harus melewati Magento\Catalog\Model\AbstractModel
dan Magento\Framework\Model\AbstractExtensibleModel
, hanya untuk akhirnya tiba Magento\Framework\Model\AbstractModel
.
Benar saja, ada metode save () di sini dan kelihatannya seperti itu
public function save()
{
$this->_getResource()->save($this);
return $this;
}
Kita melihat sekarang, setiap kali save () dipanggil pada model apa pun, metode save () dari ini AbstractModel
dipanggil, dan implementasinya adalah bahwa RESOURCE MODEL sebenarnya melakukan penghematan.
Yang terakhir ini tidak mengherankan mengingat kita selalu, karena seperti sejak awal waktu di Magento 1.0, menciptakan baik Model dan model Sumber Daya untuk hampir semua entitas.
Sekarang, mari kita lihat bagaimana cara ProductRepository
kerjanya.
Mari buka file
/vendor/magento/module-catalog/Api/ProductRepositoryInterface.php
Antarmuka ini menuntut adanya metode save (), di antara metode lainnya.
Siapa yang sebenarnya mengimplementasikan antarmuka ini?
Mari buka file
/etc/di.xml
dan periksa baris 10
<preference for="Magento\Catalog\Api\ProductRepositoryInterface" type="Magento\Catalog\Model\ProductRepository" />
Jadi, tentu saja kami menemukan maksud dari save () menthod di dalamnya
/vendor/magento/module-catalog/Model/ProductRepository
dan itu dimulai pada baris 444, terlihat seperti
public function save(\Magento\Catalog\Api\Data\ProductInterface $product, $saveOptions = false)
{
$tierPrices = $product->getData('tier_price');
try {
.... other code here ....
Metode ini mengharapkan objek $ produk dari jenis yang \Magento\Catalog\Api\Data\ProductInterface
dilewati, tetapi secara default ini memutuskan untuk Magento\Catalog\Model\Product
.
Melihat ke bawah pada baris 500, dengan try
pernyataan, kita melihat sesuatu seperti
$this->resourceModel->save($product);
Anda menebak dengan baik! $this->resourceModel
adalah tipe \Magento\Catalog\Model\ResourceModel\Product
, dinyatakan sebagai protected
properti pada baris 77.
Jadi, sekali lagi, yang ResourceModel
sebenarnya menghemat.
Tapi, antara baris 444 dan 500 sebenarnya adalah jawaban untuk pertanyaan Anda. Semua kode yang dieksekusi di sini, memang, pada akhirnya dapat dan akan menyebabkan perbedaan perilaku antara save model langsung dan cara penyimpanan repositori ini.
Misalnya repositori produk akan mendapatkan dan memproses tautan produk jika ignore_links_flag
diatur ke 0
, periksa apakah ini adalah produk yang sudah ada di tempat pertama dll.
Kita mungkin perlu menyimpulkan bahwa jika ada kebutuhan di masa depan untuk mengubah cara produk disimpan, mungkin cara yang lebih baik untuk melakukannya adalah dengan menimpa gudang produk alih-alih model produk.
Hal yang sama berlaku untuk menyimpan dan memperbarui produk. Saya lebih suka menggunakan objek repositori produk.
Saya juga merujuk Anda ke /vendor/magento/module-cms/Model/PageRepository.php
Ini adalah bagaimana halaman CMS akan disimpan melalui repositori. Di sini, semuanya lebih sederhana. Id toko diatur dan model sumber daya dipanggil untuk menyimpan segera.
Dengan pemberitahuan terakhir ini, Anda akan menyimpulkan bahwa dalam beberapa kasus, mungkin tidak ada banyak perbedaan antara penyimpanan dan penyimpanan model, tetapi bagaimanapun saya harap Anda diperlengkapi sekarang untuk melihatnya kapan pun Anda perlu melakukannya.