Magento2 belirli ExtensionFactory ve ExtensionAttributeInterface'i nasıl oluşturur?


28

Başımı uzatma öznitelikleri kullanarak, örneğin alıntı öğeleri için sarmak istiyorum.
Magento 1'deki bir kurulum sınıfını kullanarak böyle bir varlık için özel bir özellik eklemek sorun değil, bu sorunun ne olduğu değil.
Şu anda sihir, bir uzantı tarafından varlıklar API'si aracılığıyla bir uzantı niteliği olarak eklenen bir özelliği göstermek istediğimde beni şaşırtıyor.

GÜNCELLEME : Normal fabrikaların nasıl üretildiğini biliyorum. Bu soru, üretilen eklenti öznitelik arayüzleri için oluşturulan uygulamaları örnekleyen özel fabrikalar ile ilgilidir.

İşte işe almak için attığım adımlar. Bunları ekliyorum, böylece cevaplamaya çalışan her kim bu ayrıntılara girmek zorunda kalmayacak.
Benim sorum NASIL veya NEDEN işe yarıyor.

Bir varlık API'siyle bir uzantı niteliğini gösterme adımları:

  1. etc/extension_attributes.xmlVarlık arabirimine nitelik ekleyen bir oluşturma
  2. Öznitelik değerini varlıklar ExtensionAttributesörneğine eklemek için bir eklenti oluşturun .

İkinci noktayı yapabilmek için varlıklar ExtensionAttributesörneğine ihtiyaç vardır. Bu sebeple eklenti, nesne yöneticisinin DI üzerinden tedarik ettiği bir fabrikaya bağlıdır.

Teklif kalemi için örnek Magento\Quote\Api\Data\CartItemExtensionFactorykullanılmalıdır.
Sanırım bu fabrikanın türü bir şekilde kuşak sihrinin tetikleyicisi olmalı.

Magento daha sonra \Magento\Quote\Api\Data\CartItemExtensionInterfacetüm uzatma özellikleri için ayarlayıcılar ve alıcılarla eşleşen arayüzü oluşturur .
Ancak, bu arayüz için somut bir uygulama oluşturmuyor gibi görünüyor. Kiralamada PHPStorm bunu görmüyor.

Magento, sınıfı oluşturmak için ihtiyaç duyduğu bilgileri nasıl toplar? Oluşturulan arayüz yöntemleri somut bir durumda nasıl çağrılabilir? Sadece hafızada üretilen bir sınıf mı?

İşe yaradığı için mutluyum ama bu gerçekten tatmin edici değil. Magentos'un uzantılar tarafından otomatik olarak yaratılan öznitelikleri kullanabilmesi, başarısının anahtar faktörlerinden biridir. Bir modül geliştiricisi olarak, tüm süreci tam olarak anlamam gerektiğine inanıyorum.
Vaktim varsa, sadece kendimle uğraşırdım, ama bir açıklama yapabilseydim tercih ederdim.

GÜNCELLEME 2 : aracılığıyla okumak için biraz zaman aldı \Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGeneratorve \Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator. Şimdi en azından neler olup bittiği hakkında kaba bir fikrim var. Kimse beni yenemezse, bir sürecin tam bir tanımını bir noktada yazacağım, bunun faydalı bir referans olacağını düşünüyorum.


2
The Vinai yaptı .. soru sordu .. Omg
Amit Bera

Yanıtlar:


26

Her şeyden önce, otomatik üretim sınıf adı son ekine göre gerçekleşiyor, örneğin Factory, ExtensionInterface(bkz. \Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator::EXTENSION_INTERFACE_SUFFIX) Veya Extension(bkz. \Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator::EXTENSION_SUFFIX).

Buradaki son eke göre uygun jeneratör seçilir \Magento\Framework\Code\Generator::generateClass.

Magento modunun developerve eksik sınıfların anında üretilebileceğini varsayalım (derleyici kullanıldığında benzer işlemler gerçekleşir). Nesne yöneticisi somutlaştırmaya çalıştığında, diyelim Magento\Quote\Api\Data\CartItemExtensionFactoryve yok.

  1. Autoloader sınıfı başlatamadı ve burada kod üretimini başlattı \Magento\Framework\Code\Generator\Autoloader::load
  2. Daha sonra sınıf soneki Factory(burada belirtilen tüm son eklerin listesi burada bulunabilir \Magento\Framework\ObjectManager\DefinitionFactory::getCodeGenerator) olarak belirlenir ve Magento\Framework\ObjectManager\Code\Generator\Factoryeksik fabrika üretmek için karşılık gelen Fabrika jeneratör sınıfı ( ) kullanılır.
  3. Tüm otomatikleştirilmiş sınıflar her zaman başka sınıflara dayanır, fabrika olması durumunda, kaynak sınıf adı yalnızca Factoryson eki kaldırarak hesaplanır Magento\Quote\Api\Data\CartItemExtension. Bu sınıf yok ve otomatik üretim bir kez daha otomatik yükleyici tarafından çağrılıyor, ancak bu kez Extension sınıf için
  4. Şimdi sonek bu sınıfı oluşturmak için kullanılacak Extensionve \Magento\Framework\Api\Code\Generator\ExtensionAttributesGeneratorkullanılacak
  5. Extension sınıfı oluşturma için kaynak sınıfı, olduğu gibi hesaplanır Magento\Quote\Api\Data\CartItemInterfaceve Extension sınıfı başarıyla oluşturuldu. Bununla birlikte, Extension sınıf dosyasını dahil etme girişimi sırasında, otomatik olarak oluşturulmadı, çünkü Magento\Quote\Api\Data\CartItemExtensionuygulanmadı Magento\Quote\Api\Data\CartItemExtensionInterface;
  6. Sonek üretimi için kullanılacak ExtensionInterfaceve \Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGeneratorkullanılacaktır
  7. ExtensionInterface ve Extension sınıfları, buradan extension_attributes.xmlerişilebilen \Magento\Framework\Api\ExtensionAttribute\Config, ardından fabrikada üretilen bilgilere dayanarak üretilir.

Önemli bir not, ExtensionInterface için tercih edilmediğidir; di.xmlçünkü Extension ve ExtensionInterface, otomatik olarak oluşturulmuştur. Bu bir sorun değildir çünkü ExtentionInterface'in doğrudan yapı yoluyla enjekte edilmesi beklenmiyor.


@Vinai bir şey değil. Ödül hoş bir sürprizdi, teşekkürler. Güncelleme: sadece FYI, cevap kabul edildikten sonra lütuf başlatılmışsa, otomatik olarak verilmez.
Alex Paliarush

0

Benim için, bu gece, @Alex'in cevabının tepesinde, çizgileri görebiliyorum

$modelReflection = new \ReflectionClass($extensibleClassName);
        if ($modelReflection->isInterface()
            && $modelReflection->isSubclassOf(self::EXTENSIBLE_INTERFACE_NAME)
            && $modelReflection->hasMethod('getExtensionAttributes')
        ) {
            $this->classInterfaceMap[$extensibleClassName] = $extensibleClassName;
            return $this->classInterfaceMap[$extensibleClassName];
        }

sınıfta \Magento\Framework\Api\ExtensionAttributesFactory

uzatma arayüzü oluşturulmazsa hata ayıklamaya başlamak isteyebiliriz. Uzatma özelliklerinin büyük bir kısmı, Magento 2'nin bekleyeceği gibi sınıfımızı yapılandırmakla ilgilidir.

bu satırlar diyor ki:

  • extension_attributes arayüzündeki sınıf

  • \ Magento \ Framework \ Api \ ExtensibleDataInterface genişletiyor mu

  • Bu arabirime getExtensionAttributes adlı bir işleve sahiptir.

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.