Doğru yolu bulmak benim için zor olduğu için, aşağıda benim yaptığım en iyi uygulamayı bulabilirsiniz. Keyfini çıkarın, gerekirse İngilizcemi düzeltin ve eğer varsa yanılıyorum. :)
Düzenleme: ... ve ben bazı yönleriyle yanlış olduğunu öğrendim. Raphael'in cevapları daha fazla anlamama yardımcı olduktan sonra orijinal yayını güncelledim. Onun sayesinde !
Aşağıda kullanılan konsept :
Bu kavramlardan memnunsanız, aşağıdaki kodları ve açıklamaları anlamanız daha kolay olacaktır:
- Enjeksiyon Bağımlılığı (
$this->variable
kodlardaki her değişken enjekte edildiği için) - Hizmet Sözleşmesi ve Depo
- Fabrika
Bağlam :
Sadece daha fazla içeriğe sahip olmak için, doğru şekilde yapılandırılmış bir modülümüz olduğunu hayal edin:
- bir yöntem içeren bir blok sınıfı CustomBlock
getCustomModel($id)
, - bu yöntem param içinde iletilen kimliğe dayalı bir CustomModel nesnesi döndürür,
- CustomModel tipi, içindeki modele karşılık gelir
\Vendor\Module\Model\CustomModel
- Bu model kendi kaynak modeliyle birlikte gelir (in
\Vendor\Module\Model\ResourceModel\CustomModel
) - ve deposu (in
\Vendor\Module\Model\CustomModelRepository
) ile.
Soru :
- Her şeyin CustomModel nesnesini yüklemesine izin vermek için en iyi uygulama nedir?
Kullanamazsın load()
Bu yöntem kullanımdan kaldırıldığı için bir CustomModel nesnesinden .
İyi uygulama CustomModel Hizmet Sözleşmesini kullanmanız gerektiğini söylüyor. Hizmet sözleşmeleri veri arabirimleri (ör. CustomModelInterface) ve hizmet arabirimleri (ör. CustomModelRepositoryInterface). Yani bloğum şöyle görünüyor:
/ ** @var SlideRepositoryInterface * / korumalı $ slideRepository; / ** * CustomBlock oluşturucu * ... * @param CustomModelRepositoryInterface $ customModelRepository * ... * / kamu işlevi __construct ( ... CustomModelRepositoryInterface $ customModelRepository ... ) { $ this-> customModelRepository = $ customModelRepository; } genel işlev getCustomModel ($ id) { $ this-> customModelRepository-> get ($ id) öğesini döndür; }
Her şeyden önce, CustomModelRepositoryInterface
nesneyi yapıcıya enjekte ederiz ve getCustomModel()
metodumuzda kullanırız.
Sınıfta Api\CustomModelRepositoryInterface
çok fazla yok. Genellikle temel yöntemlerini ilan edecek (ama hiçbir şey farklı yapmasını önlemek): get
, getList
, save
, delete
, deleteById
. Bu konunun amacı için aşağıdaki get
yöntem beyanı aşağıdadır :
/**
* Get info by id
*
* @param int $id
* @return Data\CustomModelInterface
* @throws \Magento\Framework\Exception\NoSuchEntityException
*/
public function get($id);
Tamam, ama benim CustomModel Arabirim benim blok yapıcı bağımlılık enjeksiyon tarafından çağrılırsa, kod nerede? Bu sorunun cevabı için Magento'ya bu arayüzü uygulayan sınıfı nerede bulabileceğinizi açıklamalısınız. Modülün etc / di.xml dosyasına şunları eklemeniz gerekir:
<preference for="Vendor\Module\Api\CustomModelRepositoryInterface" type="Vendor\Module\Model\CustomModelRepository" />
Yani CustomModelRepositoryInterface
sınıf bir servis arayüzüdür. Bunu uygularken veri arayüzlerini (en azından Vendor\Module\Api\Data\CustomModelInterface
ve Vendor\Module\Api\Data\CustomModelSearchResultsInterface
) de uygulamanız gerekecektir . Modelinizin arayüzlerinizin her biri için satırları uygulaması Vendor\Module\Api\Data\CustomModelInterface
ve eklemesi gerekecektir <preference ... />
. Son olarak, hizmet sözleşmesini her kullandığınızda, mySomethingInterface
artık düşünmeyin mySomething
: magento'nun di.xml
tercihler mekanizmasını kullanmasına izin verin .
Peki, sırada ne var? CustomModelRepositoryInterface
Blok yapıcıya enjekte ederken, bir CustomModelRepository
nesne elde ederiz . CustomModelRepository
beyan yöntemini uygulamak zorundadır CustomModelRepositoryInterface
. Yani bizde bu var Vendor\Module\Model\CustomModelRepository
:
public function get ($ id) { $ customModel = $ this-> customModelFactory-> create (); $ CustomModel-> yük ($ id); if (! $ customModel-> getId ()) { yeni NoSuchEntityException atın (__ ('"% 1" kimliğine sahip CustomModel mevcut değil.', $ id)); } return $ customModel; }
Ne yapıyoruz ? CustomModel
Fabrika sayesinde boş bir nesne yaratıyoruz . Sonra CustomModel
yük modeli yöntemini kullanarak veri yüklüyoruz. Sonra params olarak id ile NoSuchEntityException
yükleyemediğimizde bir CustomModel
döneriz. Ama her şey yolundaysa, model nesnesini geri veririz ve hayat devam eder.
Ama vay be ...! Bu örnekte bu nedir?
$customModel->load($id);
load
Başlangıçtaki ile aynı itiraz yöntemi değil mi? Evet öyle. Bence bu bir utanç, ama bunu kullanmak zorunda çünkü bu load () yönteminde gönderilen bazı olaylar vardır ve geliştirici onları dinleyebilir (aşağıdaki Raphael'in cevabına bakınız).
Gelecekte Entity Manager tarafından tasarruf edeceğiz. Yeni bir Magento 2 konsepti olarak başka bir hikaye, ancak bir göz atmak istiyorsanız, Entity Manager zaten CMS'nin Kaynak Modeli'nde (v2.1) uygulandı:
public function load(AbstractModel $object, $value, $field = null)
{
$pageId = $this->getPageId($object, $value, $field);
if ($pageId) {
$this->entityManager->load($object, $pageId);
}
return $this;
}