Synfony 4 + JMS序列化器-内部服务器错误

时间:2018-12-04 09:04:28

标签: api symfony jms symfony4 jms-serializer

我对序列化数据有疑问。

我有两个实体,它们是连接关系。

它们是我的实体

Task.php

use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation as JMS;

/**
 * @ORM\Entity
 */
class Task
{
    /**
     *
     * @var integer
     *
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="IDENTITY")
     *
     */
    private $id;

    /**
     * @JMS\MaxDepth(1)
     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="task")
     *
     */
    private $user;

User.php

use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="app_user")
 */
class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Task", mappedBy="user")
     */
    private $task;

    public function __construct()
    {

我想创建API,并使用JMS序列化我的数据。我收到此错误:

内部服务器错误 服务器遇到内部错误或配置错误,无法完成您的请求。

这是我的控制者:

public function getAllAction(): JsonResponse
    {
        $tasks = $this->taskService->getAll();
        $serializer = SerializerBuilder::create()->build();
        $data = $serializer->serialize($tasks, 'json', 
        SerializationContext::create()->enableMaxDepthChecks());

        return new JsonResponse($data, 200, [], true);
    }
我的控制器中的

函数 getAll 返回带有表Task的数据。

请帮我解决我的问题。 :)

谢谢,朋友。

1 个答案:

答案 0 :(得分:0)

我没有使用JMS序列化器,但是我可以建议其他解决方案,例如symfony序列化器组件。

public function getAllAction(SerializerInterface $serializer): JsonResponse
{
    $data = $serializer->serialize($this->taskService->getAll(), 'json');
    return new JsonResponse($data, 200, [], true);
}

可选,您可以设置序列化组以避免循环引用错误。

对于要序列化的每个实体属性,设置:

use Symfony\Component\Serializer\Annotation\Groups;

/**
 * @ORM\Column(name="title", type="string", nullable=false, length=150)
 * @Assert\Type("string")
 * @Assert\NotBlank()
 * @Groups({"group_name"})
 */
private $title;

/**
 * @ORM\Column(name="description", type="string", nullable=true, length=255)
 * @Assert\Type("string")
 */
private $description;

然后只序列化具有特定组的该字段:

$serializer->serialize($this->taskService->getAll(), 'json', ['groups' => ['group_name']])

文档:https://symfony.com/doc/4.1/serializer.html#using-serialization-groups-annotations

PS。现在不需要后缀 https://symfony.com/doc/current/best_practices/controllers.html#controller-action-naming