İlk önce, save()
yöntemi doğrudan aşağıdaki product
gibi bir modelde kullanırsanız ne olacağını görelim
/**
* @var Magento\Catalog\Model\Product $product
*/
$product->save();
Model sınıfının kendisi
Magento\Catalog\Model\Product
Bu sınıf içinde save () yönteminin tanımını arayın.
Hiçbiri doğru değil mi? Peki, beforeSave () ve afterSave () vardır, ancak kendisini kurtarmaz (). İlginç, değil mi?
Sonra, 'nin ebeveyn sınıflarına bakmamız gerekir Magento\Catalog\Model\Product
.
Geçmemiz lazım Magento\Catalog\Model\AbstractModel
ve Magento\Framework\Model\AbstractExtensibleModel
sonunda gelmek için Magento\Framework\Model\AbstractModel
.
Tabii ki, burada bir save () yöntemi var ve şuna benziyor
public function save()
{
$this->_getResource()->save($this);
return $this;
}
Şimdi görüyoruz, herhangi bir modelde save () çağrıldığında, bundan save () yöntemi AbstractModel
çağrılır ve uygulama KAYNAK MODEL'inin gerçekte kaydetme yaptığıdır.
Her zaman olduğumuz göz önüne alındığında bu sonuncusu şaşırtıcı değildir, çünkü Magento 1.0'da zamanın başlangıcından itibaren, hemen hemen her varlık için hem bir Model hem de bir Kaynak modeli yaratır.
Şimdi, nasıl ProductRepository
çalıştığına bir bakalım .
Açık dosya sağlar
/vendor/magento/module-catalog/Api/ProductRepositoryInterface.php
Bu arabirim, diğer yöntemlerin yanı sıra bir save () yöntemi olmasını gerektirir.
Aslında bu arayüzü kim uyguluyor?
Açık dosya sağlar
/etc/di.xml
ve kontrol hattı 10
<preference for="Magento\Catalog\Api\ProductRepositoryInterface" type="Magento\Catalog\Model\ProductRepository" />
Doğal olarak, içindeki save () menthod'un uygulanmasını buluyoruz
/vendor/magento/module-catalog/Model/ProductRepository
ve 444. satırda başlıyor.
public function save(\Magento\Catalog\Api\Data\ProductInterface $product, $saveOptions = false)
{
$tierPrices = $product->getData('tier_price');
try {
.... other code here ....
Bu yöntem \Magento\Catalog\Api\Data\ProductInterface
, geçirilen bir $ ürün nesnesinin geçmesini bekler , ancak varsayılan olarak bu çözümlenir Magento\Catalog\Model\Product
.
Aşağıda 500 numaralı satıra baktığımızda, bir try
açıklama kazanarak ,
$this->resourceModel->save($product);
İyi tahmin ettin! $this->resourceModel
tiptedir \Magento\Catalog\Model\ResourceModel\Product
, ilan protected
hat 77 mülk.
Yani, yine, ResourceModel
aslında tasarruf yapar.
Ancak, 444 ve 500 arasındaki satırlar aslında sorunuzun cevabıdır. Burada yürütülen tüm kod, sonuçta, doğrudan model kaydetme ile bu depo kaydetme yolu arasındaki davranış farklılıklarına yol açabilir ve yol açacaktır.
Örneğin, ürün deposu, ignore_links_flag
olarak ayarlanmışsa ürün bağlantılarını alır ve işler 0
, bunun ilk etapta mevcut bir ürün olup olmadığını kontrol edin vb.
Gelecekte, ürünün nasıl kaydedileceğini değiştirmek için herhangi bir ihtiyaç olursa, belki de bunu yapmanın en iyi yolunun, ürün modeli yerine ürün havuzunu geçersiz kılmak olduğu sonucuna varmamız gerekir.
Aynı şey ürünleri kaydetmek ve güncellemek için de geçerlidir. Ürün veri havuzu nesnesini kullanmayı tercih ederim.
Ben de sizi /vendor/magento/module-cms/Model/PageRepository.php
Bir CMS sayfası depo aracılığıyla bu şekilde kaydedilir. Burada işler daha basit. Mağaza kimliği ayarlanır ve hemen kaydetmek için kaynak modeli çağrılır.
Bu son bildirimle, bazı durumlarda, depo ve model tasarrufu arasında çok fazla farklılık olmayabileceği sonucuna varacaksınız, ancak yine de umarım şimdi ihtiyacınız olduğunda onları tespit etmek için donanımlısınızdır.