gpt4 book ai didi

Symfony 序列化 Doctrine 实体

转载 作者:行者123 更新时间:2023-12-04 23:40:51 30 4
gpt4 key购买 nike

我有一个简单的实体类:

<?php
namespace AppBundle\Entity;

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


/**
* @ORM\Entity(repositoryClass="CompanyUserRepository")
* @ORM\Table(name="company_users")
*/
class CompanyUser
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

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

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

/**
* @ORM\OneToMany(targetEntity="Score", mappedBy="user")
*/
private $scores;
/**
* Constructor
*/
public function __construct()
{
$this->scores = new ArrayCollection();
}

/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}

/**
* Set firstName
*
* @param string $firstName
*
* @return CompanyUser
*/
public function setFirstName($firstName)
{
$this->firstName = $firstName;

return $this;
}

/**
* Get firstName
*
* @return string
*/
public function getFirstName()
{
return $this->firstName;
}

/**
* Set lastName
*
* @param string $lastName
*
* @return CompanyUser
*/
public function setLastName($lastName)
{
$this->lastName = $lastName;

return $this;
}

/**
* Get lastName
*
* @return string
*/
public function getLastName()
{
return $this->lastName;
}

/**
* Add score
*
* @param \AppBundle\Entity\Score $score
*
* @return CompanyUser
*/
public function addScore(\AppBundle\Entity\Score $score)
{
$this->scores[] = $score;

return $this;
}

/**
* Remove score
*
* @param \AppBundle\Entity\Score $score
*/
public function removeScore(\AppBundle\Entity\Score $score)
{
$this->scores->removeElement($score);
}

/**
* Get scores
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getScores()
{
return $this->scores;
}

}

当我尝试获取所有用户并在 json 中序列化它们时,问题就来了:
/**
* @Route("/api/getUsers", name="getUsers")
*/
public function getUsers(Request $request){
$users = $this->getDoctrine()
->getRepository('AppBundle:CompanyUser')
->findAll();

$serializer = $this->get('serializer');
$data = $serializer->serialize($users, 'json');

return new Response($users);
}

我得到检测到循环引用(配置限制:1)。
当我删除 getScores setter/getter 时,一切正常。我只需要获取 id、firstName 和 lastName。有没有办法不序列化其他对象?

最佳答案

嗯,用 circular references 处理是很常见的事情。序列化具有关系的实体时。

解决方案编号1:实现可序列化接口(interface)并使关系属性不序列化/反序列化(大多数情况下,这是一个有效的解决方案)

解决方案编号2:setCircularReferenceLimit()此规范器的方法设置在将同一对象视为循环引用之前将其序列化的次数。它的默认值为 1。所以,在调用 serialize() 之前方法,这样做:

public function getUsers(Request $request){
$users = $this->getDoctrine()
->getRepository('AppBundle:CompanyUser')
->findAll();

$serializer = $this->get('serializer');
$serializer->setCircularReferenceLimit(2); // Change this with a proper value for your case
$data = $serializer->serialize($users, 'json');

return new Response($data);
}

**** 更新 ****

正如@Derek 在他的评论中所说,解决方案没有。 2 在某些 Symfony 版本中可能无效。然后您可以尝试以这种方式为循环引用设置处理程序:
$encoder = new JsonEncoder();
$normalizer = new ObjectNormalizer();

$normalizer->setCircularReferenceHandler(function ($object) {
return $object->getName(); // Change this to a valid method of your object
});

$serializer = new Serializer(array($normalizer), array($encoder));
var_dump($serializer->serialize($org, 'json'));

这应该返回您的实体值而不是迭代关系。

关于Symfony 序列化 Doctrine 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38069959/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com