Symfony序列化器能否反序列化返回子实体类型的嵌套实体?

10
当我反序列化我的Doctrine实体时,初始对象被正确构建/初始化,但是所有的子关系都试图被调用为数组。
根级别对象的addChild(ChildEntity $entity)方法被调用,但Symfony抛出一个错误,称addChild接收到一个数组而不是ChildEntity的实例。
Symfony自己的序列化器是否有一种将嵌套数组(子实体)反序列化为实体类型的方式?
JMS序列化器通过在属性上指定@Type("ArrayCollection<ChildEntity>")注释来处理此问题。

嘿,你找到方法了吗? - Albert Casadessús
2个回答

1

我相信Symfony序列化器与JMS序列化器相比试图保持最小,因此您可能需要为该类实现自己的反规范化器。 您可以查看添加规范化器的部分


0

可能有更简单的方法,但目前我在Symfony中使用Discriminator接口注释和对象数组的类型属性。它还可以处理一个数组中的多种类型(MongoDB):

namespace App\Model;

use Symfony\Component\Serializer\Annotation\DiscriminatorMap;

/**
 * @DiscriminatorMap(typeProperty="type", mapping={
 *    "text"="App\Model\BlogContentTextModel",
 *    "code"="App\Model\BlogContentCodeModel"
 * })
 */
interface BlogContentInterface
{
    /**
     * @return string
     */
    public function getType(): string;
}

父对象需要定义属性为接口,并提供获取、添加、删除方法:

    /**
     * @var BlogContentInterface[]
     */
    protected $contents = [];
    
    /**
     * @return BlogContentInterface[]
     */
    public function getContents(): array
    {
        return $this->contents;
    }

    /**
     * @param BlogContentInterface[] $contents
     */
    public function setContents($contents): void
    {
        $this->contents = $contents;
    }

    /**
     * @param BlogContentInterface $content
     */
    public function addContent(BlogContentInterface $content): void
    {
        $this->contents[] = $content;
    }

    /**
     * @param BlogContentInterface $content
     */
    public function removeContent(BlogContentInterface $content): void
    {
        $index = array_search($content, $this->contents);
        if ($index !== false) {
            unset($this->contents[$index]);
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接