EAV 和扩展属性

文档: https://developer.adobe.com/commerce/php/development/components/attributes/

扩展 magento 的功能可以通过两个办法:

自定义属性

获取自定义属性的示例代码

$productRepository = $om->get(
\Magento\Catalog\Api\ProductRepositoryInterface::class
);
 
$product = $productRepository->get("CPU-INT-XB-3204C-B");
 
$attribute = $product->getCustomAttribute("cores");
 
$value = $attribute->getValue(); // 6

获取所有自定义属性可以使用 $product->getCustomAttributes()

内置属性

Catalog 模块有几个属性被定义为 eav 属性,但被视为内置属性。这些属性包括:

由于 sku 被定义为内置属性,当使用 $product->getCustomAttribute("sku") 时,得到的是 null

扩展属性

通过 etc/extension_attributes.xml 定义需要为什么类扩展属性。基本格式如下:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:Api/etc/extension_attributes.xsd">
<extension_attributes for="\Test\Test1\Api\Data\UserInterface">
<attribute code="type" type="string"/>
</extension_attributes>
</config>

这个文件定义了之后,magento 会在 generated 文件夹下面生成 UserExtensionInterface 类及其实现 UserExtension

使用的时候:

$extensionAttributes = $this->userExtensionFactory->create();
$extensionAttributes->setData('bom_type', 'bom_type_test');
$user->setExtensionAttributes($extensionAttributes);

通常配合 Plugin 和 Observer 来使用,实现不修改源码即可扩展既有功能。如果是要扩展自己写的东西,直接改源码就行了。