Класи перехоплювачів - це реалізація структури дизайну перехоплювачів . Перехоплювачі - це те, як об’єктна система 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 закінчує генерування перехоплювача generateClass
методом цього класу
vendor/magento/framework/Code/Generator.php
Існують додаткові класи / об’єкти, які слід відстежити Magento\Framework\Code\Generator
- але це ми залишимо як вправу для читача.