Sensio ParamConverter STI abstract



给定位置的单表继承->A和位置->B

* @DiscriminatorMap({
*     "a" = "A",
*     "b" = "B"
* })
* @Discriminator(field = "discr", map = {
*     "a" = "A",
*     "b" = "B",
* })
abstract class Location 

在控制器中,我将发送A或B类型的扩展位置。

/**
* @RestPost("", name="create_l")
* @ParamConverter("location", converter="fos_rest.request_body")
*/
public function insert(Location $location): JsonResponse

Doctrine告诉我一个明显的信息,它不能建立抽象类,这是真的,但它应该创建子类型。

如果A出现,则应将其转换为A,而不是实例化Location。

有什么解决方案吗?

不允许创建这样的抽象实体类。看看关于单表继承的文档。您可以在这里看到,这两个类都是具体的。在您的情况下,您似乎需要一些子类LocationALocationB等。但老实说,您应该提供更多关于您的用例的详细信息,因为您似乎滥用了继承结构。

所以,经过一些研究和测试,我自己修复了它。

我的核心问题是混合了两个序列化程序,JMS和Symfony/Serializer。因此,我决定使用Symfony/Serializer,因为它可以创建抽象类的子类型。这是我的设置:

进口&实体:

use SymfonyComponentSerializerAnnotationDiscriminatorMap;
use DoctrineORMMapping as ORM;
use DoctrineORMMappingDiscriminatorColumn;
use DoctrineORMMappingInheritanceType;
/**
* @ORMEntity(repositoryClass=AbstractParent::class)
* @InheritanceType("SINGLE_TABLE")
* @DiscriminatorColumn(name="discr", type="string")
* @DiscriminatorMap(typeProperty="discr", mapping = {
*     "a"      = "AppEntityA",
*     "b"      = "AppEntityB",
* })
* @ORMTable(
*    name="abstract_parent",
* )
*/
abstract class AbstractParent extends PlaceComputable

发送保存子类型的投递请求时:

/**
* @RestPost("", name="create_subtype")
* @ParamConverter("subtype", converter="fos_rest.request_body")
*/
public function insert(AbstractParent $subtype): JsonResponse
{
// $subtype is now of Either Type 'A' or 'B'
// depending on what 'discr' member was passed to the controller
}

关于如何转换抽象类的子类型,它现在也记录在Symfony/Serializer文档中。

最新更新