Yeni veya güncellenmiş model varlıklarını nasıl kaydetmeliyim?


10

Magento 2'de depo sınıflarımız var. save()Magento 1.9'da yoğun olarak kullanılan klasik yöntem , doğruysam 2.04 veya 2.05'ten kaldırılmıştır. Yeni nesne oluşturmak için fabrikaları kullanıyordum ve yeni, örneğin aradım ürün özelliklerini ayarladıktan sonra save():

$productFactory->create()->setName()...->save()

Öte yandan yöntem içeren depolarımız da var save. Özetle şöyle kullanıyorum:

$product = $productFactory->create()->setName()... $productRepository->save($product)

Kodumda her iki şekilde çalışan sınıflar var. Ayrıca bazen farklı yolların farklı davranışlar anlamına geldiğini de fark ettim. Havuzlarla yol ek verilerin doğrulanmasını sağladı mı?

Hangi şekilde yapmalıyım?

Yanıtlar:


10

İlk önce, save()yöntemi doğrudan aşağıdaki productgibi 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\AbstractModelve Magento\Framework\Model\AbstractExtensibleModelsonunda 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 tryaçıklama kazanarak ,

$this->resourceModel->save($product);

İyi tahmin ettin! $this->resourceModeltiptedir \Magento\Catalog\Model\ResourceModel\Product, ilan protectedhat 77 mülk.

Yani, yine, ResourceModelaslı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_flagolarak 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.


1

\Magento\Catalog\Api\Data\ProductInterfaceDoğrudan model yerine veri arayüzleri (örn. ) Kullanılması ve modelleri yüklemek ve kaydetmek için depoları kullanması önerilir.

Magento geliştirici belgelerine bakın


1
tamam - bu tüm varlık için doğru yol - ama sadece bazı özniteliğin değerini güncellemek için - Bence tüm varlığı yükleme / kaydetme tavsiye edilmez.
Bartosz Kubicki
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.