Що запускає покоління фабрики в Magento 2


39

Magento 2 містить ряд файлів класу, які або попередньо згенеровані, або генеруються під час руху. Вони живуть в

var/generated

Ці створені файли включають фабричні класи. З документації я розумію, що програміст використовує фабричні класи для інстанції "неін'єкційних" об'єктів. "Неін'єкційний" об'єкт - це об'єкт, який не можна додати за допомогою __constructorін'єкції залежності, як правило, тому, що він потребує введення користувачем для інстанції.

З документації не зрозуміло, як Magento 2 знає, що це потрібно для створення заводського класу. Це трохи

Якщо менеджер об'єктів стикається з неіснуючою фабрикою в режимі виконання або компілятором, менеджер об'єктів генерує завод.

виглядає так, як якщо я використовую заводський клас у диспетчері об'єктів (або, в розширенні, в ін'єкційному режимі __constructors), що Magento 2 генерує його для мене. Але як менеджер об'єктів знає, що я запитую, це завод?

Також, схоже, є дві команди для автоматичного генерування (або "компілювання") всіх створених класів. Запуск будь-якої з цих команд генерує велику кількість заводських класів. Які файли конфігурації та / або коду ці команди шукають для створення необхідних заводських об'єктів?

Я знаю, що відстеження диспетчера об'єктів та / або коду команди до кінця дозволить виявити це, але я сподіваюсь уникнути цієї тривалої та важкої подорожі.

Відповіді:


21

Деякі цікаві місця розташування коду, як це все працює разом: https://github.com/magento/magento2/blob/develop/dev/tests/integration/testsuite/Magento/Framework/Code/GeneratorTest.php#L40

З різних типів, що надходять звідси переважно https://github.com/magento/magento2/tree/develop/lib/internal/Magento/Framework/ObjectManager/Code/Generator, а також звідси https://github.com/magento / magento2 / дерево / розробити / lib / внутрішній / Magento / Framework / перехоплення / код / ​​генератор коду перехоплення.

Це все спрацьовує автозавантажувачем тут https://github.com/magento/magento2/blob/develop/lib/internal/Magento/Framework/Code/Generator/Autoloader.php#L32

public function load($className)
{
    if (!class_exists($className)) {
        return Generator::GENERATION_ERROR != $this->_generator->generateClass($className);
    }
    return true;
}

9

Я не знайшов у коді, умови, для яких створюються фабрики, але, з мого розуміння, заводський клас формується, коли його запитують і не знаходять.
Деякі зарезервовані ключові слова Factory, Proxy, Interceptor, якщо вони використовуються, запускають генерацію коду, коли конкретні класи не знайдені.
Я відправлю назад, як тільки знайду код, який спрацьовує на заводському поколінні.
Отже, якщо ви запитуєте клас, Some\Namespace\HereFactoryа клас не існує, оскільки він закінчується ключовим словом, Factoryвін буде генерований уvar/generation/Some/Namespace/HereFactory.php


Схоже, документи повинні бути оновлені, оскільки ObjectManager насправді не генерує. Спеціальний автонавантажувач є частиною відповіді. github.com/magento/magento2/blob/develop/lib/internal/Magento/…
Кріс

1
Це співпадає з моїм досвідом (див. Gist.github.com/astorm/f245ce9c761c9a8053aa), але все-таки виникає питання 1. Де це відбувається в коді диспетчера об'єктів (тобто, яка фактична умова) 2. Як працює компілятор / генератор знаєте, які заводи генерувати?
Алан Шторм

8

Я копаю цей самий гороховий суп прямо зараз. Поки я розумію, що все те, що отримується автоматично, створюється на /var/generationоснові налаштувань та інтерфейсів, заявлених у app/etc/di.xml.

Інтерфейси та ваші уподобання будуть оголошені у di.xmlфайлі у вашому /app/code/Vendor/<module>/etc/di.xml.

Він знає, що може генерувати для вас об'єкти (и), тому що ви оголосили інтерфейс у своєму __constructorAND і оголосили перевагу цього інтерфейсу глобально або локально у відповідному di.xmlфайлі.

Я пропоную три зерна солі зі своїми коментарями.


+1 за корисну інформацію - але здається, що Фабрики надходять звідкись, крім di.xmlфайлів - ви можете надіслати щось у диспетчер об’єктів, який закінчується у Factory, і він створить файл для вас.
Алан Шторм

Чи допомагає це? bit.ly/1BOtdie
Стів Джонсон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.