我想使用扩展属性来解决问题,例如引用项目。
使用像Magento 1这样的设置类向这样的实体添加自定义属性没有问题,这不是这个问题。
现在,当我想公开由扩展程序通过实体API添加的属性作为扩展属性时,魔术使我不知所措。
更新:我知道常规工厂是如何生成的。这个问题是关于特殊工厂的,这些工厂为生成的扩展属性接口实例化生成的实现。
这是我要使其正常工作所采取的步骤。我要添加这些内容,因此无论是谁尝试回答,都无需赘述。
我的问题是如何或为何它的工作原理。
通过实体API公开扩展属性的步骤:
- 创建一个
etc/extension_attributes.xml
将属性添加到实体接口的 - 创建一个插件以将属性值添加到实体
ExtensionAttributes
实例。
为了做第二点,ExtensionAttributes
需要实体实例。因此,插件依赖于工厂,对象管理器通过DI提供该工厂。
对于报价项目Magento\Quote\Api\Data\CartItemExtensionFactory
,必须使用示例。
我猜想工厂的类型一定是引发魔力的触发器。
然后,Magento \Magento\Quote\Api\Data\CartItemExtensionInterface
用所有扩展属性的设置器和获取器生成匹配接口。
但是,它似乎并未为该接口生成具体的实现。至少,PHPStorm没有看到它。
Magento如何收集生成类所需的信息?如何在具体实例上调用生成的接口方法?它是仅在内存中生成的类吗?
我很高兴它能奏效,但这并不能令人满意。Magentos使用扩展自动创建的属性的能力是其成功的关键因素。作为模块开发人员,我相信我需要对整个过程有透彻的了解。
如果我有时间,我自己会自己研究一下,但是我希望能得到一个解释。
更新2:花一点时间阅读\Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator
和阅读\Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator
。现在我至少有一个大概的想法。如果没有人击败我,我将在某一时间写一个完整的过程的描述,因为我认为这将是一个有用的参考。