Magento 2: що таке файл перехоплювачів у варі / поколінні?


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 закінчує генерування перехоплювача generateClassметодом цього класу

vendor/magento/framework/Code/Generator.php

Існують додаткові класи / об’єкти, які слід відстежити Magento\Framework\Code\Generator- але це ми залишимо як вправу для читача.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.