Magento 2: что такое файл Interceptors в var / generation?

24

Итак, я заметил несколько Interceptor.phpфайлов вvar/generation

Я знаю, что эта папка содержит созданные классы, созданные на лету для следующего:

  • Фабрики
  • Доверенные
  • Плагины

Я предполагаю, что файлы Interceptor связаны с плагинами, однако иногда я не понимаю, как эти файлы генерируются. Например, у меня есть, var/generation/Magento/Framework/App/Response/Http/Interceptor.phpно этот файл не соответствует ни одному из существующих классов.

Итак, я ищу хорошо объясненный рабочий процесс о том, как создаются файлы Interceptor.php?

Рафаэль в цифровом пианизме
источник

Ответы:

32

Классы перехватчиков являются реализацией шаблона проектирования перехватчиков . Перехватчики - это то, как объектная система 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- но мы оставим это как упражнение для читателя.

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