Які класи є "Перехопленням / підключенням" в Magento 2


17

Дата: 30 травня 2015 року (враховуючи мінливий характер Magento 2).

Magento 2 представив концепцію плагінів , реалізовану за допомогою схеми перехоплення .

Що в документах не зрозуміло, - які класи та об'єкти в Magento "перехоплюють"? Тобто ви налаштовуєте плагін з XML, який виглядає наступним чином

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

але незрозуміло, які класи дійсні як ObservedType. Ця старіша стаття у Вікі містить деякі підказки, коли йдеться

Зверніть увагу, що функція плагіна не застосовується до - класів, створених без введення залежності, тобто створених безпосередньо з новим оператором, -фінальних методів, -фінальних класів

Чи можливий перехоплення будь-якого об'єкта, створеного за допомогою ін'єкції залежності? Чи ObservedTypeпотрібна підказка типу, що надається у __constructметоді, чи може це (чи має бути?) Чимось іншим?

В основному намагаюсь обернути голову навколо того, що можна, а що не можна зробити з перехоплювачем Magento 2, перш ніж я розпочну їх використовувати.

Відповіді:


10

Кожен клас модуля Magento є взаємозалежним.

Як описано в поточній вікі, вона обмежена остаточними методами та класами

Не підтверджено, але класам бібліотек (каталог lib) забороняється перехоплюватися.

Обмеження того, як створений об'єкт, більше не відповідає дійсності, я думаю, принаймні, якщо автозавантажувач правильно налаштований. І не має значення, оскільки вони не створюються на льоту, але коли генератор буде виконаний. (тому справа лише в тому, що автозавантажувач magento повинен бути першим)


2
У нас немає обмежень для перехоплення класів lib. Крім того, щоб об'єкт був перехоплений, його слід створити за допомогою ObjectManager (конструкторська ін'єкція).
Антон Криль

1
Слід зазначити, що магічні методи (але заявлені за допомогою phpdoc) не можуть бути перехоплені. Я думаю. Стиль Varien_Object в деяких місцях існує.
nevvermind

11

Ми працюємо над анотаціями "@api", щоб анотувати рекомендовані методи, які будуть більш стабільними в релізах. Якщо ви турбуєтеся про оновлення, окрім того, що може мати плагін, слід також розглянути питання про те , який плагін повинен бути визначений. Ми не рекомендуємо перехоплення методів, які не застосовуються @ api, але іноді ми знаємо, що це може бути найкращим варіантом. (Ми залишаємо це на розсуд розробника.)

Офіційно можна перехопити публічні методи, які не є остаточними. Приватні методи, безумовно, не працюють. З пам’яті в даний час перехоплення працює, створюючи клас нащадка, який успадковує реальний клас (рамка введення залежності створює екземпляри згенерованого класу, коли ви запитуєте про новий екземпляр реального класу). Отже, все, що дозволить створити підклас і переотримати оригінальний метод, ймовірно, спрацює, але публічні методи рекомендуються, що дає нам гнучкість використовувати іншу розумну реалізацію в майбутньому (що ніколи не стане реалістичним без поважних причин) .


5

Я знаю, що на це вже є відповідь, але це вже з 2 років тому. Можливо, деякі речі тим часом змінилися.

Ось що я знайшов поки що.
Від офіційної документації та від копання в процесі перехоплення.

Я відповім навпаки.
Що НЕ МОЖЕ бути перехопленим у Magento 2.
Від офіційного док

  • Об'єкти, які інстанціюються перед завантаженням Magento \ Framework \ Interception (не впевнений, де ця точка)
  • Заключні методи
  • Будь-який метод із заключних класів (оскільки згенерований клас перехоплювача повинен поширювати вихідний клас)
  • Будь-який клас, який містить хоча б один остаточний публічний метод
  • Непублічні методи (це може працювати для захищених методів, але це не є "етичним", оскільки він би відкривав непублічні методи поза межами класу)
  • статичні методи
  • __конструювати
  • Віртуальні типи

З копання

  • методи в класах, які не інстанціюються за допомогою диспетчера об'єктів. (Приклад \Magento\Framework\Phrase)
  • заняття реалізація \Magento\Framework\ObjectManager\NoninterceptableInterface. (Наприклад, \Magento\Framework\App\Cache\Proxyі всі інші автогенеровані проксі)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.