Какие классы являются «перехватываемыми / подключаемыми» в 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. Эта старая статья в вики дает некоторые подсказки, когда говорит

Обратите внимание, что функция плагина не распространяется на - классы, созданные без внедрения зависимостей, то есть созданные непосредственно с оператором new, -Final методы, -Final классы

Является ли какой - либо объект , созданный с помощью инъекции зависимостей , доступной для перехвата? Нужно ли ObservedTypeуказывать подсказку типа в __constructметоде a или это может быть что-то еще?

Главным образом пытаясь понять, что можно и что нельзя делать с перехватчиком Magento 2, прежде чем я начну их использовать.

Алан Сторм
источник

Ответы:

10

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

Как описано в текущей вики, оно ограничено финальными методами и классами

Не проверено, но классы библиотек (каталог lib) (/ должны) не могут быть перехвачены.

Я думаю, что ограничение на создание объекта больше не соответствует действительности, по крайней мере, если автозагрузчик настроен правильно. И не должно иметь значения, поскольку они создаются не на лету, а после запуска генератора. (так что это только вопрос, magento автозагрузчик должен быть первым)

Flyingmana
источник
2
У нас нет ограничений на перехват классов lib. Также для того, чтобы объект был перехватываемым, он должен быть создан с помощью ObjectManager (внедрение в конструктор).
Антон Крыль
1
Следует отметить, что магические методы (но объявленные с использованием phpdoc) не могут быть перехвачены. Я думаю. Стиль Varien_Object все еще существует в некоторых местах.
nevvermind
11

Мы работаем над аннотациями "@api", чтобы комментировать рекомендуемые методы, которые будут более стабильными в разных выпусках. Если вы беспокоитесь о возможности обновления, в дополнение к тому, что может иметь определенный плагин, вы должны также подумать о том, что должен быть определен плагин. Мы не рекомендуем перехват не-api методов, но иногда мы знаем, что это может быть лучшим вариантом. (Мы оставляем это на усмотрение разработчика.)

Официально вы можете перехватить публичные методы, которые не являются окончательными. Частные методы определенно не будут работать. Из памяти перехват в настоящее время работает путем создания класса-потомка, который наследует реальный класс (среда внедрения зависимостей создает экземпляры сгенерированного класса, когда вы запрашиваете новый экземпляр реального класса). Так что все, что позволит создать подкласс и переопределить оригинальный метод, вероятно, будет работать, но публичные методы рекомендуются, что дает нам гибкость в использовании какой-то другой умной реализации в будущем (что никогда не будет реалистичным без веской причины) ,

Алан Кент
источник
5

Я знаю, что на это уже есть ответ, но это было 2 года назад. Может быть, кое-что изменилось за это время.

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

Я отвечу наоборот.
Что НЕ МОЖЕТ быть перехвачено в Magento 2.
Из официального документа

  • Объекты, которые создаются перед загрузкой Magento \ Framework \ Interception (не уверен, где находится эта точка)
  • Финальные методы
  • Любой метод из конечных классов (поскольку сгенерированный класс-перехватчик должен расширять исходный класс)
  • Любой класс, который содержит хотя бы один последний публичный метод
  • Непубличные методы (они могут работать для защищенных методов, но это не «этично», так как они открывают непубличные методы для внешних пользователей)
  • статические методы
  • __construct
  • Виртуальные типы

Копаться

  • методы в классах, которые не создаются с помощью менеджера объектов. (Пример \Magento\Framework\Phrase)
  • Реализация классов \Magento\Framework\ObjectManager\NoninterceptableInterface. (Например \Magento\Framework\App\Cache\Proxyи все другие автоматически сгенерированные прокси)
Мариус
источник