Magento 2'de Depo ve Fabrika Ne Zaman Kullanmalıyız?


75

Magento 2'de birkaç ders verdim ve bu beni biraz şaşırtıyor. Ticari varlıkları okuyabilmemiz / yazabilmemiz için iki yol var.

Verileri Al

Fabrika Yaklaşımını Kullanma

$object = $this->myFactory->create();
$object->load($myId);

Havuz Yaklaşımını Kullanma

$repo   = $this->myRepository();
$object = $repo->getById($myId);

Veri kaydet

Fabrika Yaklaşımını Kullanma

$object = $this->myFactory->create();
$object->load($myId);
$object->setData('something', 'somethingDifferent')->save();

Havuz Yaklaşımını Kullanma

$repo   = $this->myRepository();
$object = $repo->getById($myId);
$object->setData('something', 'somethingDifferent');
$repo->save($object);

Bağımlılık enjeksiyonunu kullanarak hem depo hem de fabrika sınıfının enjekte edilebileceğini de görebiliyorum. Bu en azından benim için kafa karıştırıcı.

Depo yaklaşımını ve fabrika yaklaşımını ne zaman kullanmalıyız? İzlememiz gereken en iyi uygulama nedir?


Fabrika, Koleksiyon Fabrika ve Depo kullanımına güzel bir örnek \ Magento \ Kurulum \ Fikstür \ Kategori
Ricardo Martins

Yanıtlar:


72

Bir havuz varsa ve ihtiyacınız olanı yaparsa, her zaman depoyu tercih edin.

Depolar, Hizmet Sözleşmelerinin bir parçasıdır ( arayüzlerin uygulamalarıdır Api), bu, diğer modüllerle ortak bir arayüz olarak kastedildikleri anlamına gelir.

Tam yükleme için Depoları kullanın.

$model->load()servis sözleşmesinin bir parçası değildir. Bu konu hakkında bir sorum vardı, cevapları yararlı bulabilirsin: Servis sözleşmelerinde $ model-> load () 'ı tercih etmenin bir nedeni var mı?

Yeni varlıklar oluşturmak için Fabrikaları kullanın

Depolar yeni bir varlık yaratma yöntemleriyle gelmez, bu durumda bir fabrikaya ihtiyacınız olacaktır. Ama için fabrika kullanmak arayüzüne gibi Magento\Catalog\Api\Data\ProductInterfaceFactory- bu DI yapılandırmasına göre doğru uygulanmasını yaratacaktır.

Sonra repository->save()kaydetmek için yöntemi kullanın.

Daha fazla kontrole ihtiyacınız varsa Koleksiyon Fabrikalarını kullanın

Aşağıdakiler resmi Magento en iyi uygulaması değildir, ancak şu anda depolar size ne yükleneceği konusunda hassas kontrol sağlamazlar. Arama kriterleri API filtreleri tanımlamanıza izin verir, ancak örneğin, belirli EAV niteliklerini seçmenin veya hangi dizin tablolarının birleştirileceğini belirtmenin bir yolu yoktur.

Bunlar, hizmet sözleşmesi API'lerinden gizlenen uygulama ayrıntılarıdır, ancak çoğu zaman bu uygulama ayrıntıları önemlidir ve bunları görmezden gelirseniz düşük performans elde edersiniz. Bu nedenle, depolar beni sınırlandırır bağlamaz altta yatan koleksiyonları kullanmakta tereddüt etmiyorum.


2
Yeni varlıklar oluşturmak için Fabrikaların kullanımı hakkında bir kod örneği verebilir misiniz , açıklama bazı detayları özlüyor ve anlaşılması zor. Çok teşekkür ederim.
Anahtar Shang


Teşekkürler. fakat use the factory for the interface, such as Magento\Catalog\Api\Data\ProductInterfaceFactory - it will create the right implementation based on DI configuration.anlayamadığım nokta ise, geliştirme kılavuzları InterfaceFactory'yi tanıtmıyor , repository->save()yeni varlıkları kurtarmak için nasıl bir yöntem kullanılmalı ? Sadece fabrikaları depoyu değil yeni varlıkları kurtarmak için kullanabilirim.
Anahtar Shang

@Key Shang, bu arayüz size tablonun her sütununu kaydetmek için tüm ayarlanmış veri işlevlerini vereceği anlamına gelir, böylece yeni kayıtları kaydetmek için mümkün olan her yerde arayüzü kullanmaya çalışın. InterfaceFactory sınıfları di: compile'nin bir parçası olarak oluşturulur, böylece onları var / generation klasöründe görebilirsiniz.
stevensagaar

@stevensagaar Teşekkürler, şimdi anlayabiliyorum.
Anahtar Shang

21

İyi soru.

Hem Depolar hem de Fabrikalar bir Varlığa erişmemize izin verse bile, sorumluluklarına odaklanmamız gerektiğini düşünüyorum .

Magento dokümantasyonundan : "Fabrikalar, enjekte edilemeyen sınıfları başlatan hizmet sınıflarıdır, yani bir veritabanı varlığını temsil eden modellerdir. ObjectManager ile işletme kodu arasında bir soyutlama katmanı oluştururlar."

Alan Storm'un makalesinden : "Bir nesne, nesne bilgilerinizi bir nesne deposuna okumaktan ve yazmaktan sorumludur"

Yorumum şudur: Amacımız, enjekte edilemeyen ("yeni" olarak adlandırılan) nesnelerle çalışmaksa Fabrikaları kullanmalıyız; Odak noktamız bir nesne deposundaki nesneleri aramak / okumak / yazmaksa, Depoları kullanmalıyız.

Bu benim konuyla ilgili idealist yaklaşımım; Gerçek uygulamanın, Alan'ın da belirttiği gibi, işleri karıştırmaya zorlayabileceğimizi unutmayın.

Keyfini çıkarın.


5

Veri okuma / yazma ile işletme mantığı arasında kod ayrımına izin verdikleri için depoları kullanmaya başlamanın ileriye gideceğini söyleyebilirim.

Alan Storm tarafından bu konuda, depoların nasıl kullanılacağını açıklayan ve bu yeni yöntemin bazı dezavantajlarına bakarak açıklayan çok ayrıntılı bir makale var: http://alanstorm.com/magento_2_understanding_object_repositories/

Ayrıca, Magento belgelerinde, bu yeni yaklaşımın faydalarını açıklayan: http://devdocs.magento.com/guides/v2.0/extension-dev-guide/service-contracts/service-contracts.html


2
Cevap için teşekkürler. Aslında bu şüpheyi kafamda alanstorm'un yazdığı makaleden alıyorum. :)
Rajeev K Tomy

3
Aslında, düşünmenizi sağlar, ama bu muhtemelen iyi bir şey. Bu Magento tarafından önerilen en iyi uygulama olsa bile, geliştiricilerin soru soramayacağı ve bazı yönlerini eleştiremeyeceği anlamına gelmez. Ayrıca, depolarda kapsanmayan durumlar da vardır. Ancak, bina bağlamında, depoları kullanarak gelecekteki sürümleri bozmayacak uzantılar dikkate alınmalıdır. Ayrıca, daha fazla geliştireceklerinden ve geliştiricilerin ihtiyaç duyduğu şeylerle ilgili daha fazla güvence sunacaklarından eminim.
Marina Vilcea,

% 100 yorumunuzla aynı fikirdeyim. Gerçekten de öyle umuyorum. Ayrıca lütfen Fabian'ın cevabını da görün.
Rajeev K Tomy

Evet, gördüm :) cevabını çoktan aştı. Bu mükemmel soru için teşekkürler!
Marina Vilcea,

Dahası, bir yerde daha düşük seviye veri manipülasyonu yönteminin yükleme / yükseltme komut dosyalarında $setup->updateTableRow(...);veya fabrikalarda ok kullanmanın uygun olduğunu okudum , emin değilim ama daha yüksek seviye kullanmanın argümanları o alana da uygulanabilir gibi geliyor, ne düşünüyorsunuz?
saat

1

Umarım bu cevap diğer uzantı geliştiricilerine de yardımcı olabilir.

Yalnızca Depo kullanarak modeli kaydetmemiz gerekiyor.

  1. Magento 2'deki Fabrika Modeli çok sınırlı veri tutar.
  2. Öte yandan, Depo Modeli, müşteri, ürünler vb. İle ilgili eav özellikleri olması durumunda tüm verileri içerir.
  3. Tasarruf modeli için, herhangi bir varlığı saklamak için her zaman Depoyu kullanın, fabrika modeli model kurtarmak için kullanılıyorsa, o varlıkla ilgili tüm sistem dışı eav niteliklerini siler (müşteri, ürün vb.).

  4. Model yüklemek için, havuz getById () yöntemini kullanarak model almak için en iyi seçenektir.

Model kurtarma amacıyla Deposu olabildiğince özel olarak kullanmanızı tavsiye ederim.


1

Şimdi yükleme, kaydetme, silme yöntemleri (modeller) kullanımdan kaldırıldı. Bu yüzden kaynak modelini veya depoyu kullanabiliriz.

Magento şimdi kaydetme, silme, yükleme işlemleri için varlık yöneticisi konseptini kullanıyor.

Kaynak modelleri bu işlemleri gerçekleştirmek için varlık yöneticisi nesnesine sahiptir.

$categoryModel = $this->_objectManager->create('\Magento\Catalog\Model\CategoryFactory')->create();        
  $categoryResource = $this->_objectManager->create('\Magento\Catalog\Model\ResourceModel\Category');        
  $categoryResource->load($categoryModel, 3);        
  echo $categoryModel->getName();
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.