Вопрос:
Почему мой ответ возвращается "пустым", когда я устанавливаю обратный вызов setCircularReferenceHandler
?
EDIT:
Казалось бы, что он ничего не возвращает, но устанавливает заголовок в 500 Internal Server Error
. Это запутывает, поскольку Symfony должен отправить какой-то ответ об ошибке на ошибку?
Я обернул $json = $serializer->serialize($data, 'json');
в try/catch, но явная ошибка не выбрасывается, поэтому ничего не поймано. Любые идеи были бы действительно полезными.
Контекст:
При запросе на Entity Media я получаю пустой ответ. Entity Media отображается (с доктриной) в Entity Author. Поскольку они связаны, при попытке сериализации могут возникать неопределенные циклы.
Я надеялся, что с помощью Circular Reference Handler я мог бы избежать этого, но он не работает.
Ошибка:
Это ошибка, которую я получаю, когда я НЕ задает круглый обработчик ссылок:
Циклическая ссылка была обнаружена при сериализации объекта класса "Proxies__CG __\AppBundle\Entity\Author\Author "" (сконфигурированный предел: 1) (500 внутренних ошибок сервера)
Теперь эта ошибка полностью ожидаема, так как мой автор Entity указывает на 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();
})
];
}
}
Что я пробовал:
Мои объекты реализуют интерфейс JsonSerializable
, поэтому я определяю, какие атрибуты возвращаются (что требуется JsonSerializeNormalizer
). Это работает полностью , когда я удаляю свойство "medias" в классе Author, все работает.
Вот как я использую свой 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);
}
}