Slavenin999
@Slavenin999
программист php/erlang/elixir/js

Почему JMS Serializer игнорирует файлы мапинга сущностей при ручной сериализации?

Доброго времени суток, %habrauser%!

Пользуюсь симфони для rest с соответствующим стандартным набором бандлов. При простом возвращении объекта в качестве результата выполнения метода сериализация проходит корректно по мапингу. Но вот понадобилось сериализовать сущность руками и столкнулся с стем, что мапинг игнорируется полностью. И всё бы ничего, можно было бы настроить всё аннотациями, но мой класс пользователей наследуется от фосовского, а там уже ничего не допишешь. Как сделать так, чтобы при ручной сериализации работали мапинг-файлы?

конфиг:
jms_serializer:
    metadata:
        debug: %kernel.debug%
        file_cache:
            dir: "%kernel.cache_dir%/serializer"
        auto_detection: true
        directories:
            FOSUserBundle:
                namespace_prefix: FOS\UserBundle
                path: "@ApiRestRestBundle/Resources/config/serializer/fosuser"


Файлы мапинга лежат в директории Resources/config/serializer

Код для сериализации:
use JMS\Serializer\SerializerBuilder;

$serializer = SerializerBuilder::create()->build();
$ser_user = $serializer->serialize($user, 'json');
  • Вопрос задан
  • 2447 просмотров
Решения вопроса 1
benbor
@benbor
Помог ответ - не забудь лайкнуть
Смотрите, в Symfony2 есть такая вещь как Dependency Injection . В чем смысл? В том, что все сервисы которые Вам нужны, вы настраиваете в конфиг файлах, конфиг файлы парсяться Symfony, а вкоде вы пользуетесь котовыми сервисами. Теперь смотрим на Ваш код:
jms_serializer: 
....

вы настариваете сериалайзер, который попадет в DI
use JMS\Serializer\SerializerBuilder;

$serializer = SerializerBuilder::create()->build();
$ser_user = $serializer->serialize($user, 'json');

А здесь вы создаете НОВЫЙ инстанс сериалзиатора, и юзаете его. Этот SerializerBuilder это фабрика, он возвращает НОВЫЙ сериализатор. Он ничего не знает о ваших конфигах.
Найдите, как в ваш код внедрить уже настроенный serializer. (если Ваш код контроллер $serializer = $this->get('jms_serializer'))
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы