【发布时间】:2017-09-05 15:34:31
【问题描述】:
问题:
当我设置setCircularReferenceHandler 回调时,为什么我的响应返回“空白”?
编辑:
看起来它什么也不返回,但确实将标头设置为500 Internal Server Error。这很令人困惑,因为 Symfony 应该发送某种关于错误的错误响应?
我将 $json = $serializer->serialize($data, 'json'); 包裹在 try/catch 中,但没有抛出显式错误,因此没有捕获任何内容。任何想法都会很有帮助。
上下文:
查询实体媒体时,我得到一个空白响应。实体媒体(使用 Doctrine)映射到实体作者。由于它们是链接在一起的,因此在尝试序列化时可能会出现无限循环。
我曾希望使用循环引用处理程序可以避免这种情况,但它不起作用。
错误:
这是我在不设置循环引用处理程序时遇到的错误:
序列化类“Proxies__CG__\AppBundle\Entity\Author\Author”的对象时检测到循环引用(配置限制:1)(500 内部服务器错误)
现在这个错误是完全可以预料到的,因为我的实体作者在最初查询媒体时指向实体媒体 (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();
})
];
}
}
我尝试过的:
我的实体实现了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);
}
}
【问题讨论】:
-
您是否尝试添加元数据并启用
enable_max_depth设置来解决此问题?见“Handling Serialization Depth” -
你想序列化多少层?
-
enable_max_depth被任何扩展AbstractObjectNormalizer的东西使用。JsonSerializableNormalizer直接继承自AbstractNormalizer,根本不使用该选项。
标签: php symfony doctrine-orm php-7.1 symfony-3.3