在这种情况下,应使用扩展属性机制。它允许通过第三方模块扩展核心API。启用新扩展名属性的通用步骤:
- 按照官方文档中的说明声明扩展属性。清除
var
并运行后<project_root>/bin/magento setup:di:compile
,该新属性的对应的setter和getter应该出现在\Magento\Customer\Api\Data\GroupExtensionInterface
(此界面是自动生成的)
- 写插件
\Magento\Customer\Api\GroupRepositoryInterface::save
,\Magento\Customer\Api\GroupRepositoryInterface::getById
(以及任何其他服务方式需要)以保存/加载新的属性。作为扩展开发人员,只有您知道此属性应该存储在哪里,可以是任何表。见\Magento\Downloadable\Model\Plugin\AroundProductRepositorySave::aroundSave
作为一个例子
- 如果需要使该属性在集合中可见(使其可搜索/可过滤),则声明
join
node。如果没有,那就跳过这个
- 访问自定义属性为:
$customerGroup->getExtensionAttributes()->getMyAttribute()
,其中customerGroup
工具\Magento\Customer\Api\Data\GroupInterface
。setMyAttribute()
也可以使用
以下是应放置的配置示例 VendorName/ModuleName/etc/extension_attributes.xml
<?xml version="1.0"?>
<config>
<extension_attributes for="Magento\Customer\Api\Data\GroupInterface">
<!--Data interface can be used as a type of attribute, see example in CatalogInventory module-->
<attribute code="name_of_attribute" type="string">
<resources>
<resource ref="VendorName_ModuleName::someAclNode"/>
</resources>
<!--Join is optional, only if you need to have added attribute visible in groups list-->
<join reference_table="table_where_attribute_is_stored" reference_field="group_id_field_in_that_table" join_on_field="group_id">
<field>name_of_added_attribute_field_in_that_table</field>
</join>
</attribute>
</extension_attributes>
</config>