一尘不染

反序列化与Symfony序列化程序组件有关系的实体

json

我正在尝试使用symfony序列化程序组件反序列化具有关系的实体。这是我的实体:

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Document
 *
 * @ORM\Table(name="document")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\DocumentRepository")
 */
class Document
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="Genre", inversedBy="documents")
     * @ORM\JoinColumn(name="id_genre", referencedColumnName="id")
     */
    private $genre;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=100)
     */
    private $name;

    //getters and setters down here
    ...
}

流派实体

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * Genre
 *
 * @ORM\Table(name="genre")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\GenreRepository")
 */
class Genre
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=50, nullable=true)
     */
    private $name;

    /**
     * @ORM\OneToMany(targetEntity="Document", mappedBy="genre")
     */
    private $documents;

    public function __construct()
    {
        $this->documents= new ArrayCollection();
    }

    //getters and setters down here
    ....
}

现在在我的 控制器操作中, 我正在尝试以下操作:

$encoders = array(new JsonEncoder());
$normalizers = array(new ObjectNormalizer());
$serializer = new Serializer($normalizers, $encoders);

$document = $serializer->deserialize($request->getContent(), 'AppBundle\Entity\Document', 'json');

还有我的 json数据

{"name": "My document", "genre": {"id": 1, "name": "My genre"}}

但是我得到了下一个 错误

给定类型为“ AppBundle \ Entity \ Genre”,“ array”的预期参数(500内部服务器错误)

是否可以使用内部具有关系的实体反序列化json请求?

感谢您的放心。


阅读 263

收藏
2020-07-27

共1个答案

一尘不染

是的,没有。首先,您不应该在控制器中重新创建序列化程序的新实例,而应使用serializer服务。

其次,不,Symfony序列化程序不可能立即可用。我们正在https://api-platform.com/中进行此操作,但其中存在一些魔术。就是说,已经建立了PR来支持它:https
:
//github.com/symfony/symfony/pull/19277

2020-07-27