我正在编写一个 shopware 6 插件,它添加一个自定义实体并通过与现有实体的一对一关联将其关联。
这是我的自定义实体的重要部分:
class OAuthUserDefinition extends EntityDefinition
{
[...]
protected function defineFields(): FieldCollection {
return new FieldCollection([
(new IdField('id', 'id'))->addFlags(new Required(), new PrimaryKey()),
(new FkField('customer_id', 'customerId', CustomerDefinition::class)),
new OneToOneAssociationField('customer', 'customer_id', 'id', CustomerDefinition::class)
]);
}
}
我像这样扩展了客户实体:
class CustomerExtension extends EntityExtension{
public function extendFields(FieldCollection $collection): void {
$collection->add(
(new OneToOneAssociationField(
'oAuthUser',
'id',
'customer_id',
OAuthUserDefinition::class
))
);
}
public function getDefinitionClass(): string
{
return CustomerDefinition::class;
}
}
这是我的迁移:
public function update(Connection $connection): void
{
$connection->executeUpdate('
CREATE TABLE IF NOT EXISTS `nt_oauth_user` (
`id` BINARY(16) NOT NULL,
`customer_id` BINARY(16) NULL,
`oauth_user_id` VARCHAR(36) NOT NULL,
`created_at` DATETIME(3) NOT NULL,
`updated_at` DATETIME(3) NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fk.oauth_user.customer_id` FOREIGN KEY (`customer_id`)
REFERENCES `customer` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
');
}
还有我的 service.xml
<?xml version="1.0" ?>
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
<services>
<service id="Nt\OAuthClient\Core\System\OAuthUser\OAuthUserDefinition">
<tag name="shopware.entity.definition" entity="nt_oauth_user" />
</service>
<service id="Nt\OAuthClient\Core\Checkout\Customer\CustomerExtension">
<tag name="shopware.entity.extension"/>
</service>
</services>
</container>
现在有了这个代码,商店软件完全崩溃了,我在大多数端点上都收到了 HTTP 错误 503。我认为它会遇到递归,因为如果我false
在客户扩展中将 OneToOneAssociationField 自动加载属性设置为 503 错误就会消失。但是store-api/v1/account/customer
给了我一个
"status": "500",
"title": "Internal Server Error",
"detail": "Argument 1 passed to Shopware\\Core\\System\\SalesChannel\\Api\\StructEncoder::encode() must be an instance of Shopware\\Core\\Framework\\Struct\\Struct, null given, called in /app/vendor/shopware/platform/src/Core/System/SalesChannel/Api/StructEncoder.php on line 214",
因为customer->extensions->oAuthUser
是null
。
如果我交换它,请将 OneToOneAssociationField 扩展上的自动加载设置回我true
的false
自定义实体中,一切似乎都可以正常工作,但这不是很实用。
它的递归部分对我来说似乎是商店用品中的错误,还是我这边有错误?我是否需要以某种方式提供自定义结构?