问题:当我设置setCircularReferenceHandler回调时,为什么我的响应返回“空白”?
编辑:似乎它没有返回任何内容,但确实将标题设置为“500内部服务器错误”。这很困惑,因为Symfony应该发送有关错误的某种错误响应?
我在try / catch中包装了$json = $ serializer->serialize($ data,'json'); 但没有明确的错误被抛出,因此什么也没捕获。任何想法都会非常有帮助。
上下文:查询实体媒体时,我得到一个空白响应。使用Doctrine将实体媒体映射到实体作者。由于它们链接在一起,因此在尝试序列化时可能会发生无限循环。
我曾希望使用循环引用处理程序可以避免这种情况,但它不起作用。
错误:当我未设置循环引用处理程序时,这是我收到的错误:
“在序列化类“Proxies__CG__\AppBundle\Entity\Author\Author”的对象时检测到循环引用(配置极限:1)(500个内部服务器错误)”
现在这个错误是完全预期的,因为我的实体作者在最初查询媒体(
编辑:似乎它没有返回任何内容,但确实将标题设置为“500内部服务器错误”。这很困惑,因为Symfony应该发送有关错误的某种错误响应?
我在try / catch中包装了$json = $ serializer->serialize($ data,'json'); 但没有明确的错误被抛出,因此什么也没捕获。任何想法都会非常有帮助。
上下文:查询实体媒体时,我得到一个空白响应。使用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”属性时,这完全有效,一切正常。
以下是我如何使用我的序列化程序和规范化程序。
/**
* @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
设置来解决这个问题了吗?请参阅“处理序列化深度” - Nicolai Fröhlichenable_max_depth
被任何扩展AbstractObjectNormalizer
的内容使用。JsonSerializableNormalizer
直接继承自AbstractNormalizer
,并且根本不使用该选项。 - Kal Zekdor