Классы перехватчиков являются реализацией шаблона проектирования перехватчиков . Перехватчики - это то, как объектная система Magento 2 реализует систему плагинов .
Как разработчик клиента, теория заключается в том, что вам не нужно беспокоиться о перехватчиках - вы запрашиваете у менеджера объектов объект типа X, и он возвращает его вам. Запрашиваемый вами объект может быть или не быть перехватчиком, но с точки зрения программиста клиента он ведет себя так же, как и версия без перехватчика. Как менеджер объектов решает возвращать или не возвращать перехватчик в деталях реализации.
Для людей, интересующихся подробностями реализации - если в классе или родительском классе этого класса настроен плагин, диспетчер объектов возвращает перехватчик. Вы можете увидеть это в классе перехватчика в режиме разработчика здесь
#File: vendor/magento/framework/Interception/ObjectManager/Config/Developer.php
public function getInstanceType($instanceName)
{
$type = parent::getInstanceType($instanceName);
if ($this->interceptionConfig && $this->interceptionConfig->hasPlugins($instanceName)
&& $this->interceptableValidator->validate($instanceName)
) {
return $type . '\\Interceptor';
}
return $type;
}
Для производства (т. Е. В режиме компиляции) Magento предварительно сканирует систему в режиме компиляции и отмечает, какие классы нуждаются в плагинах.
Что касается фактического поколения, Magento обрабатывает это с помощью автозагрузчика PHP. Если разработчик создает экземпляр класса (или иным образом запускает событие автозагрузки PHP с именем класса (в подсказке типа, class_exists
классе и т. Д.), И автозагрузчик на основе композитора не может найти файл класса, второй зарегистрированный автозагрузчик
Magento\Framework\Code\Generator\Autoloader::load
срабатывает. Этот автозагрузчик
vendor/magento/framework/Code/Generator/Autoloader.php
будет (косвенно через Magento\Framework\Code\Generator
класс) сканировать класс на наличие определенных шаблонов именования. Если имя класса заканчивается Interceptor
, Magento заканчивает тем, что генерирует Interceptor через generateClass
метод в этом классе
vendor/magento/framework/Code/Generator.php
Есть дополнительные классы / объекты, которые нужно отследить Magento\Framework\Code\Generator
- но мы оставим это как упражнение для читателя.