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 属性,但被视为内置属性。这些属性包括:
- attribute_set_id
- created_at
- group_price
- media_gallery
- name
- price
- sku
- status
- store_id
- tier_price
- type_id
- updated_at
- visibility
- weight
由于 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 来使用,实现不修改源码即可扩展既有功能。如果是要扩展自己写的东西,直接改源码就行了。