是什么触发了Magento 2中工厂的产生


39

Magento 2包含许多预先生成或即时生成的类文件。他们住在

var/generated

这些生成的文件包括工厂类。根据文档,据我了解,程序员使用工厂类来实例化“不可注入”对象。“不可注入”对象是无法通过__constructor依赖项注入添加的对象,通常是因为它需要用户输入才能实例化。

从文档中不清楚的是Magento 2如何知道它需要生成工厂类。这一点

如果对象管理器在运行时模式或编译器中遇到不存在的工厂,则对象管理器将生成工厂。

听起来好像我在对象管理器中使用工厂类(或者,在依赖项注入__constructors中使用扩展)时,Magento 2会为我生成它。但是对象管理器如何知道我要的东西是工厂?

同样,似乎有两个 命令可以自动生成(或“编译”)所有生成的类。运行这些命令中的任何一个都会生成大量的Factory类。 这些命令在寻找什么配置和/或代码文件以生成所需的工厂对象?

我知道一直追踪对象管理器和/或命令代码将揭示这一点,但是我希望避免那漫长而艰巨的旅程。

Answers:


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 / tree / develop / lib / internal / Magento / Framework / Interception / Code / Generator用于拦截代码。

这都是由自动加载器在这里触发的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/…–
Chris O'Toole

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
史蒂夫·约翰逊
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.