skobkin
@skobkin
Гентушник, разработчик на PHP и Symfony.

Как реализовать десериализацию иерархии вложенных объектов с помощью Symfony Serializer?

Привожу упрощенный пример кода:
class PostsPage
{
    /**
     * @var MetaPost[]
     * @Serializer\Groups({"import_post_page"})
     */
    private $posts;
// ...
}

class MetaPost
{
    /**
     * @var Recommendation
     * @Serializer\Groups({"import_post_page"})
     */
    private $rec;

    /**
     * @var Post
     * @Serializer\Groups({"import_post_page"})
     */
    private $post;
// ...
}

// ...
// Для сокращения количества кода сеттеры и геттеры как и прочие свойства были убраны


Естественно, есть JSON, в котором всё соответствует этой структуре. Вопрос: можно ли сделать разворачивание этого JSON в полноценную структуру данных учитывая классы? Точнее, если можно, то как конкретно указать сериализатору на то, откуда в какой тип данных надо разворачивать. Если просто сделать по примеру из документации так:
$data = $serializer->deserialize($json, 'SomeNamespace\PostsPage', 'json');

То в $dataбудет инстанс класса PostsPage. Но вот в $postsу него будет просто многомерный массив, а не массив объектов типа MetaPost (собственно, я и не ждал чуда с чтением @var из аннотаций).
В официальной документации я не увидел особо указаний, как десериализовать иерархию объектов, а по поисковым запросам вылезает JMS Serializer, который-то я и так знаю как настроить, но мне интересно, как избавиться от лишней зависимости не первой свежести, учитывая, что у Symfony есть свой компонент, нацеленный на эти задачи.

UPD: У меня было подозрение, что можно использовать коллбэки для свойств, но полностью описывать коллбэками все вложенные объекты во-первых непонятно как именно, во-вторых - как-то некрасиво.
  • Вопрос задан
  • 444 просмотра
Решения вопроса 1
prototype_denis
@prototype_denis
Symfony
Думаю следующие пару ссылок натолкнут на верные поиски
https://github.com/doctrine/DoctrineModule/blob/ma...
https://packagist.org/search/?q=serializer

Serializer от Symfony сам по себе по сути ничего не умеет. (Имеется ввиду работоспособность из коробки, как у JMS)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы