Magento 2'de hangi sınıflar “Kesişim / Eklenti”


17

Tarih: 30 Mayıs 2015 (Magento 2'nin değişen doğası göz önüne alındığında).

Magento 2 , bir önleme düzeni ile uygulanan bir eklenti konsepti geliştirdi .

Belgelerden net olmayan şey - Magento'daki hangi sınıflar ve nesneler "kesişebilir"? Yani, XML ile aşağıdakine benzeyen bir eklenti yapılandırırsınız

<config>
    <type name="{ObservedType}">
        <plugin name="{pluginName}" type="{PluginClassName}" sortOrder="1" disabled="true"/>
    </type>
</config>

ancak hangi sınıfların bir olarak geçerli olduğu açık değildir ObservedType. Bu eski wiki makalesi ,

Eklenti özelliğinin aşağıdakiler için geçerli olmadığını lütfen unutmayın - Bağımlılık enjeksiyonu olmadan oluşturulan sınıflar, yani doğrudan yeni operatörle oluşturulan, -Final yöntemler, -Final sınıfları

Is herhangi mevcut bağımlılık enjeksiyon yoluyla oluşturulan nesne ele geçirilmesi? ObservedTypeBir __constructyöntemde sağlanan tür ipucu olması mı gerekiyor , yoksa başka bir şey olabilir mi?

Temelde, onları kullanmaya başlamadan önce bir Magento 2 önleme cihazı ile neler yapılabileceğini ve yapılamayacağını kafamda tutmaya çalışıyorum.

Yanıtlar:


10

Bir Magento Modülünün her Sınıfı birbirine bağlanabilir.

Mevcut wiki'de açıklandığı gibi, son yöntemler ve sınıflarla sınırlıdır

Doğrulanmamış, ancak kütüphane sınıflarının (lib dizini) ele geçirilmesine izin verilmiyor (/ gerekir).

En azından otomatik yükleyici doğru yapılandırılmışsa, nesnenin nasıl oluşturulduğuna dair sınırlama artık doğru değil. Ve anında yaratılmadıkları için değil, jeneratör çalıştırıldığında önemli olmalı. (bu yüzden sadece bir sorun, ilk otomatik eflatun olmalıdır.)


2
Lib sınıflarının ele geçirilmesi konusunda bir sınırımız yok. Ayrıca nesnenin yakalanabilir olması için ObjectManager (yapıcı enjeksiyonu) ile oluşturulması gerekir.
Anton Kril

1
Sihirli yöntemlerin (ancak phpdoc kullanılarak beyan edildiği gibi) ele geçirilemeyeceğine dikkat edilmelidir. Bence. Varien_Object stili hala bazı yerlerde var.
nevvermind

11

Sürümler arasında daha kararlı olacak önerilen yöntemlere açıklama eklemek için "@api" ek açıklamaları üzerinde çalışıyoruz . Eğer yükseltilebilirlik dert varsa, ne ek içinde olabilir bir eklenti tanımlı olması, ayrıca neyi düşünmelisiniz gereken bir eklenti tanımlı var. @ Api olmayan yöntemlere müdahale edilmesini önermiyoruz, ancak bazen bunun en iyi seçenek olabileceğini biliyoruz. (Bunu geliştiricinin takdirine bırakıyoruz.)

Resmi olarak, nihai olmayan genel yöntemleri kesebilirsiniz. Özel yöntemler kesinlikle işe yaramaz. Bellekten, kesişme şu anda gerçek sınıfı devralan bir alt sınıf oluşturarak çalışır (bağımlılık enjeksiyon çerçevesi, gerçek sınıfın yeni bir örneğini istediğinizde oluşturulan sınıfın örneklerini oluşturur). Bu nedenle, bir alt sınıfın oluşturulmasına izin verecek ve orijinal yöntemin geçersiz kılınmasına izin verecek her şey muhtemelen işe yarayacaktır, ancak gelecekte başka akıllı bir uygulama kullanmak için esneklik sağlayan (iyi bir sebep olmadan gerçekçi olmayacak) bize genel yöntemler önerilir. .


5

Bunun zaten bir cevabı olduğunu biliyorum, ama 2 yıl önceydi. Belki bu arada bazı şeyler değişti.

İşte şimdiye kadar bulduğum şey.
Gönderen Resmi belgelerin ve durdurma sürecine kazma dan.

Ben diğer tarafa cevap vereceğim.
Ne CAN NOT Magento 2. ele geçirilebilir
resmi doc itibaren

  • Magento \ Framework \ Interception önyüklenmeden önce başlatılan nesneler (bu noktanın nerede olduğundan emin değilim)
  • Son yöntemler
  • Son sınıflardan herhangi bir yöntem (çünkü oluşturulan önleme sınıfı orijinal sınıfı genişletmek zorundadır)
  • En az bir nihai genel yöntem içeren herhangi bir sınıf
  • Kamuya açık olmayan yöntemler (korunan yöntemler için işe yarayabilir, ancak kamusal olmayan yöntemleri sınıfın dışına maruz bırakacağı için bu "etik" değildir)
  • statik yöntemler
  • __construct
  • Sanal türler

Etrafı kazmaktan

  • nesne yöneticisi aracılığıyla somutlaştırılmayan sınıflardaki yöntemler. (Örnek \Magento\Framework\Phrase)
  • sınıfları uygulama \Magento\Framework\ObjectManager\NoninterceptableInterface. (Örneğin \Magento\Framework\App\Cache\Proxyve diğer tüm otomatik oluşturulmuş proxy'ler)
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.