如何在 Sylius 中自定义实体 属性?
How to customize an entity property in Sylius?
我正在开发 Sylius 应用程序,想修改一个 属性 实体。
更具体地说:我想要实现的是使ProductVariant.onHand
(或者实际上是数据库中的相应列)nullable
。
Sylius的文档提供了一篇吉祥文章“Customizing Models”。但它没有描述如何更改现有 属性.
的定义
如何修改 Sylius (Core) 实体的 属性 如 ProductVariant.onHand
?
到目前为止我尝试了什么:我扩展了 Sylius\Component\Core\Model\ProductVariant
并向 onHand
添加了一个 Doctrine 注释 属性:
/**
* @ORM\Entity
* @ORM\Table(name="sylius_product_variant")
*/
class ProductVariant extends BaseProductVariant
{
...
/**
* ...
* @ORM\Column(type="integer", nullable=true)
*/
protected $onHand = 0;
...
}
嗯,extend
class 绝对是正确的步骤。它也能正常工作:
$ bin/console debug:container --parameter=sylius.model.product_variant.class
------------------------------------ -----------------------------------
Parameter Value
------------------------------------ -----------------------------------
sylius.model.product_variant.class App\Entity\Product\ProductVariant
------------------------------------ -----------------------------------
但是天真的添加 属性 定义导致错误:
$ ./bin/console doctrine:schema:validate
Property "onHand" in "App\Entity\Product\ProductVariant" was already declared, but it must be declared only once
ProductVariant 似乎在配置文件中有映射。
如果捆绑包在配置文件而不是注释中定义其实体映射,您可以像任何其他常规捆绑包配置文件一样覆盖它们。唯一需要注意的是,您必须覆盖所有这些映射配置文件,而不仅仅是您实际想要覆盖的文件。
https://symfony.com/doc/4.4/bundles/override.html#entities-entity-mapping
您也可以尝试创建一个具有所需映射的新实体(您需要自己添加所有列)并将 sylius.model.product_variant.class 指向这个新的 class.
可以通过添加 AttributeOverrides
注释来覆盖实体配置:
/**
* @ORM\Entity
* @ORM\Table(name="sylius_product_variant")
* @ORM\AttributeOverrides({
* @ORM\AttributeOverride(
* name="onHand",
* column=@ORM\Column(
* name="on_hand",
* type="integer",
* nullable=true
* )
* )
* })
*/
class ProductVariant extends BaseProductVariant
{
...
/**
* ...
* no changes
*/
protected $onHand;
...
}
相关学说文档文章:
我正在开发 Sylius 应用程序,想修改一个 属性 实体。
更具体地说:我想要实现的是使ProductVariant.onHand
(或者实际上是数据库中的相应列)nullable
。
Sylius的文档提供了一篇吉祥文章“Customizing Models”。但它没有描述如何更改现有 属性.
的定义如何修改 Sylius (Core) 实体的 属性 如 ProductVariant.onHand
?
到目前为止我尝试了什么:我扩展了 Sylius\Component\Core\Model\ProductVariant
并向 onHand
添加了一个 Doctrine 注释 属性:
/**
* @ORM\Entity
* @ORM\Table(name="sylius_product_variant")
*/
class ProductVariant extends BaseProductVariant
{
...
/**
* ...
* @ORM\Column(type="integer", nullable=true)
*/
protected $onHand = 0;
...
}
嗯,extend
class 绝对是正确的步骤。它也能正常工作:
$ bin/console debug:container --parameter=sylius.model.product_variant.class
------------------------------------ -----------------------------------
Parameter Value
------------------------------------ -----------------------------------
sylius.model.product_variant.class App\Entity\Product\ProductVariant
------------------------------------ -----------------------------------
但是天真的添加 属性 定义导致错误:
$ ./bin/console doctrine:schema:validate
Property "onHand" in "App\Entity\Product\ProductVariant" was already declared, but it must be declared only once
ProductVariant 似乎在配置文件中有映射。
如果捆绑包在配置文件而不是注释中定义其实体映射,您可以像任何其他常规捆绑包配置文件一样覆盖它们。唯一需要注意的是,您必须覆盖所有这些映射配置文件,而不仅仅是您实际想要覆盖的文件。
https://symfony.com/doc/4.4/bundles/override.html#entities-entity-mapping
您也可以尝试创建一个具有所需映射的新实体(您需要自己添加所有列)并将 sylius.model.product_variant.class 指向这个新的 class.
可以通过添加 AttributeOverrides
注释来覆盖实体配置:
/**
* @ORM\Entity
* @ORM\Table(name="sylius_product_variant")
* @ORM\AttributeOverrides({
* @ORM\AttributeOverride(
* name="onHand",
* column=@ORM\Column(
* name="on_hand",
* type="integer",
* nullable=true
* )
* )
* })
*/
class ProductVariant extends BaseProductVariant
{
...
/**
* ...
* no changes
*/
protected $onHand;
...
}
相关学说文档文章: