Magento'da Bir Fabrikanın Üretimini Tetikleyen Nedir?


39

Magento 2, önceden oluşturulmuş veya anında oluşturulmuş birkaç sınıf dosyası içerir. Yaşıyorlar

var/generated

Bu oluşturulan dosyalar fabrika sınıflarını içerir. Gönderen belgeler , bir programcı örneğini "olmayan enjektabl" nesnelere fabrika sınıflarını kullanan benim anladığıma. Bir "olmayan enjekte" nesne bir amacı olamaz yoluyla ilave edilebilir __constructorörneğini kullanıcı girişi gerektirir, çünkü genellikle, bağımlılık enjeksiyon.

Belgelerde açık olmayan şey, Magento 2'nin fabrika sınıfı oluşturması gerektiğini nasıl bildiğidir. Bu biraz

Çalışma zamanı modunda veya derleyicide nesne yöneticisi olmayan bir fabrikaya rastlarsa, nesne yöneticisi fabrikayı oluşturur.

nesne yöneticisinde bir fabrika sınıfı kullanıyorsam (ya da uzantı olarak, __nanstrüktif bağımlılıkta), Magento 2'nin benim için üreteceği gibi geliyor. Fakat nesne yöneticisi istediğim şeyin bir fabrika olduğunu nereden biliyor?

Ayrıca, oluşturulan tüm sınıfları otomatik olarak oluşturmak (veya "derlemek") için iki komut var gibi görünüyor . Bu komutlardan herhangi birini çalıştırmak çok sayıda Fabrika sınıfı oluşturur. Hangi komut ve / veya kod dosyaları bu komutlar gerekli fabrika nesnelerini oluşturmak için bakıyor?

Nesne yöneticisinin ve / veya komut kodunun sonuna kadar takip edilmesinin bunu ortaya çıkaracağını biliyorum, ancak bu uzun ve zorlu yolculuktan kaçınmayı umuyorum.

Yanıtlar:


21

Tüm bunların birlikte nasıl çalıştığıyla ilgili ilginç bir kod yeri: https://github.com/magento/magento2/blob/develop/dev/tests/integration/testsuite/Magento/Framework/Code/GeneratorTest.php#L40

Farklı türlerin çoğunlukla buradan gelmesi ile https://github.com/magento/magento2/tree/develop/lib/internal/Magento/Framework/ObjectManager/Code/Generator ayrıca buradan da https://github.com/magento geliyor / magento2 / tree / develop / lib / internal / Magento / Çerçeve / Kesişme / Kod / Kesişme kodu için üretici .

Hepsi burada otomatik yükleyici tarafından tetiklenir https://github.com/magento/magento2/blob/develop/lib/internal/Magento/Framework/Code/Generator/Autoloader.php#L32

public function load($className)
{
    if (!class_exists($className)) {
        return Generator::GENERATION_ERROR != $this->_generator->generateClass($className);
    }
    return true;
}

9

Kodlarda, fabrikaların üretildiği koşulları bulamadım, ancak anladıktan sonra talep edildiğinde ve bulunmadığında bir fabrika sınıfı oluşturuldu.
Bazı ayrılmış anahtar kelimeler vardır Factory, Proxy, Interceptor, eğer kullanılıyorsa, belirli sınıflar bulunamadığında kod üretmeyi tetikler.
Fabrika üretimini tetikleyen kodu bulur bulmaz geri göndereceğim.
Bu nedenle, eğer sınıfı talep ederseniz Some\Namespace\HereFactoryve sınıf mevcut olmaz, çünkü anahtar kelimeyle biteceği için sınıfta Factoryoluşturulur.var/generation/Some/Namespace/HereFactory.php


ObjectManager gerçekten bir üretici olmadığından dokümanlar güncellenmeli gibi görünüyor. Özel otomatik yükleyici cevabın bir parçası. github.com/magento/magento2/blob/develop/lib/internal/Magento/…
Chris O'Toole

1
Bu benim tecrübemle aynı hizada (bkz. Gist.github.com/astorm/f245ce9c761c9a8053aa), ancak 1. soruyu gündeme getirdi. Jeneratör hangi fabrikaları üreteceğini biliyor mu?
Alan Storm,

8

Şu anda aynı bezelye çorbasını kazıyorum. Şimdiye kadar anladığım kadarıyla, otomatik olarak üretilen tüm öğelerin, /var/generationbildirilen tercihlerden ve arayüzlerden yapıldığıdır app/etc/di.xml.

Arayüzleriniz ve tercihleriniz sizin di.xmldosyalarınızda belirtilecektir /app/code/Vendor/<module>/etc/di.xml.

Sizin için nesneyi / nesneleri üretmeyi biliyor çünkü AND'inizde bir arayüz __constructoraçıkladınız VE bu arayüz için uygun di.xmldosyada global olarak ya da yerel olarak bir tercih ilan ettiniz .

Yorumlarımla birlikte üç tane tuz istiyorum.


Yararlı bilgiler için +1 - ancak Fabrikalar di.xmldosyalar dışında bir yerden geliyor gibi görünüyor - Fabrika'da biten nesne yöneticisine bir şey gönderebilir ve sizin için bir dosya oluşturacaktır.
Alan Storm

Bu yardımcı olur mu? bit.ly/1BOtdie
Steve Johnson
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.