Magento 2 содержит ряд файлов классов, которые либо предварительно сгенерированы, либо создаются на лету. Они живут в
var/generated
Эти сгенерированные файлы включают фабричные классы. Из документации я понимаю, что программист использует фабричные классы для создания экземпляров «неинъекционных» объектов. «Неинъецируемый» объект - это объект, который не может быть добавлен посредством __constructor
внедрения зависимости, обычно потому, что для его создания требуется пользовательский ввод.
Что не ясно из документации, так это то, что Magento 2 знает, что ему нужно создать фабричный класс. Этот бит
Если менеджер объектов в режиме выполнения или компилятор обнаруживает несуществующую фабрику, менеджер объектов генерирует фабрику.
звучит так, будто если я использую фабричный класс в диспетчере объектов (или, как следствие, в внедрении зависимостей __constructors), Magento 2 сгенерирует его для меня. Но как менеджер объектов узнает, что я запрашиваю фабрику?
Кроме того, кажется, есть две команды для автоматической генерации (или «компиляции») всех сгенерированных классов. Выполнение любой из этих команд генерирует большое количество классов Factory. Какие файлы конфигурации и / или кода эти команды рассматривают для создания необходимых заводских объектов?
Я знаю, что отслеживание менеджера объектов и / или кода команды до конца показало бы это, но я надеюсь избежать этого долгого и трудного пути.
источник
Я копаюсь в этом самом гороховом супе прямо сейчас. Насколько я понимаю, пока все, что автоматически генерируется,
/var/generation
делается из предпочтений и интерфейсов, объявленных вapp/etc/di.xml
.Ваши интерфейсы и предпочтения будут объявлены
di.xml
в вашем файле/app/code/Vendor/<module>/etc/di.xml
.Он знает, как сгенерировать объект (ы) для вас, потому что вы объявили интерфейс в своем
__constructor
AND и объявили предпочтение для этого интерфейса глобально или локально в соответствующемdi.xml
файле.Я предлагаю три зерна соли с моими комментариями.
источник
di.xml
файлов - вы можете отправить что-то в диспетчер объектов, который заканчивается в Factory, и он сгенерирует файл для вас.