我对序列化数据有疑问。
我有两个实体,它们是连接关系。
它们是我的实体
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的数据。
请帮我解决我的问题。 :)
谢谢,朋友。
答案 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