kem*_*ica 11 php symfony doctrine-orm php-7.1 symfony-3.3
当我设置setCircularReferenceHandler
回调时,为什么我的响应返回"空白" ?
编辑:
看起来它什么都不返回,但确实将标题设置为500 Internal Server Error
.这是令人困惑的,因为Symfony应该发送有关错误的某种错误响应?
我$json = $serializer->serialize($data, 'json');
在try/catch中包装但没有抛出显式错误,因此没有捕获任何内容.任何想法都会非常有用.
查询实体媒体时,我得到一个空白的回复.实体媒体(与Doctrine)映射到实体作者.由于它们是链接的,因此在尝试序列化时可能会发生无限循环.
我曾希望使用循环参考处理程序,我可以避免这一点,但它不起作用.
当我没有设置循环引用处理程序时,这是我得到的错误:
序列化类"Proxies__CG __\AppBundle\Entity\Author\Author"(配置限制:1)的对象时检测到循环引用(500内部服务器错误)
现在这个错误是完全可以预料的,因为我的实体作者在最初查询Media时指向了Entity Media(Media -> Author -> Media
)
class Author implements JsonSerializable {
//Properties, Getters and setters here
/**
* Specify data which should be serialized to JSON
* @link http://php.net/manual/en/jsonserializable.jsonserialize.php
* @return mixed data which can be serialized by <b>json_encode</b>,
* which is a value of any type other than a resource.
* @since 5.4.0
*/
function jsonSerialize()
{
return [
"title" => $this->getTitle(),
"id" => $this->getId(),
"firstname" => $this->getFirstname(),
"lastname" => $this->getLastname(),
//This is the problem right here. Circular reference.
"medias" => $this->getAuthorsMedia()->map(function($object){
return $object->getMedia();
})
];
}
}
Run Code Online (Sandbox Code Playgroud)
我的实体实现了JsonSerializable
接口,因此我定义了返回的属性(这是JsonSerializeNormalizer
需要的).当我删除作者类中的"medias"属性时,这完全有效,一切正常.
这是我如何使用我的规范化器的serliazer.
/**
* @Route("/media")
* Class MediaController
* @package BackBundle\Controller\Media
*/
class MediaController extends Controller
{
/**
* @Route("")
* @Method({"GET"})
*/
public function listAction(){
/** @var MediaService $mediaS */
$mediaS= $this->get("app.media");
/** @var array $data */
$data = $mediaS->getAll();
$normalizer = new JsonSerializableNormalizer();
$normalizer->setCircularReferenceLimit(1);
$normalizer->setCircularReferenceHandler(function($object){
return $object->getId();
});
$serializer = new Serializer([$normalizer], [new JsonEncoder()]);
$json = $serializer->serialize($data, 'json');
return new Response($json);
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试重现您的错误,对我来说一切都按预期工作(请参阅下面的代码示例)。
所以,你的 setCircularReferenceHandler() 工作正常。
也许尝试运行我的代码,并逐步用您的真实实体和数据源更新它,直到您看到导致错误的原因。
测试(而不是你的控制器):
class SerializerTest extends \PHPUnit\Framework\TestCase
{
public function testIndex()
{
$media = new Media();
$author = new Author();
$media->setAuthor($author);
$author->addMedia($media);
$data = [$media];
$normalizer = new JsonSerializableNormalizer();
$normalizer->setCircularReferenceLimit(1);
$normalizer->setCircularReferenceHandler(function($object){
/** @var Media $object */
return $object->getId();
});
$serializer = new Serializer([$normalizer], [new JsonEncoder()]);
$json = $serializer->serialize($data, 'json');
$this->assertJson($json);
$this->assertCount(1, json_decode($json));
}
}
Run Code Online (Sandbox Code Playgroud)
媒体实体
class Media implements \JsonSerializable
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var Author
*
* @ORM\ManyToOne(targetEntity="Author", inversedBy="medias")
* @ORM\JoinColumn(name="author_id", referencedColumnName="id")
*/
private $author;
/**
* {@inheritdoc}
*/
function jsonSerialize()
{
return [
"id" => $this->getId(),
"author" => $this->getAuthor(),
];
}
//todo: here getter and setters, generated by doctrine
}
Run Code Online (Sandbox Code Playgroud)
作者实体
class Author implements \JsonSerializable
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var Media[]
*
* @ORM\OneToMany(targetEntity="Media", mappedBy="author")
*/
private $medias;
/**
* {@inheritdoc}
*/
function jsonSerialize()
{
return [
"id" => $this->getId(),
"medias" => $this->getMedias(),
];
}
//todo: here getter and setters, generated by doctrine
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
979 次 |
最近记录: |