Спасибо!

Команды в контроллерах мы до сих пор заполняли данными из JSON-запросов вручную. Это неудобно. И любое несоответствие типов приведёт к ошибке 500 Server Error.
Вместо этого упростим себе работу и автоматизируем ввод и вывод JSON для наших запросов и команд с помощью компонента Serializer. И сделаем красивый вывод списка ошибок типов при неверных запросах:
Чтобы не пропускать новые эпизоды подпишитесь на наш канал @deworkerpro в Telegram

Спасибо!
Благодарю за детальность, Дмитрий!
Для меня очень своевременно, так как я сам набрел на Symfony Serializer за три дня до выхода эпизода.
Традиционный вопрос чайника:
Вы сконфигурировали сериалайзер для десиарилизации (объект->string) используя несколько отдельных нормализаторов:
return new Serializer([
...$normalizers,
new DateTimeNormalizer(),
new PropertyNormalizer(
classMetadataFactory: new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())),
propertyTypeExtractor: new PropertyInfoExtractor(
typeExtractors: [
new PhpDocExtractor(),
new ReflectionExtractor(),
]
)
),
new ArrayDenormalizer(),
], [
new JsonEncoder(),
]);
и создали непонятные для меня вспомогательные классы Denormalizer, Normalizer.
А так как в моем проекте я собираюсь десереализовывать DTO классы как со свойствами, так и с геттерами/сеттерами, то одного PropertyNormalizer будет недостаточно.
Поэтому вместо набора частных нормалайзеров, я объектов я использовал (больше интуитивно) один могучий объект ObjectNormalizer:
MyObjectSerializer::class => static function (): Serializer {
$normalizers = [
new ObjectNormalizer(
null,
null,
null,
new ReflectionExtractor()
)
];
$encoders = new JsonEncoder();
return new Serializer([
...$normalizers,
// new GetSetMethodNormalizer(),
new ArrayDenormalizer(),
], [
$encoders
]);
},
И свое дело он делает: преобразует json в мой кастомный DTO объект. Причем рекурсивно десериализует сложные вложенные объекты из json во вложенные DTO объекты ( У меня сложная форма с данными из разных таблиц и модулей)
Исходя из этого, мучаюсь вопросами:
1) Для описанного выше функционала (десериализация сложных структур в сложные объекты) , есть ли равенство в использовании сериалайзера собранного
из моего набора: ObjectNormalizer + ReflectionExtractor
и
из Вашго набора: PropertyNormalizer + ArrayDenormalizer + для моего функционала, видимо, придется добавить GetSetMethodNormalizer
На взгляд чайника - мой вариант лаконичнее.
2) также, пока не могу придумать практического применения для массивов, которые Вы используете как временные промежуточные объекты между строками и объектами в процессах serialize/deserialize. Ведь навскидку проще реализовать основную задачу (преобразовывать данные json->object/object->json) напрямую, используя ObjectNormalizer без массивов посредников.
В чём мои заблуждения?
Желаю процветать и здравствовать!
есть ли равенство в использовании сериалайзера собранного из моего набора и вашего набора
Да, если нужны геттеры и сеттеры, тогда лучше взять ObjectNormalizer.
Если не нужны, то тогда использовать PropertyNormalizer.
Проще реализовать основную задачу (преобразовывать данные json->object/object->json) напрямую.
Поэтому в видео и показаны оба варианта, что можно так и так.
Дмитрий, с Вашей конфигурацией сериалайзера, моя десериализация прошла - как задумано. Значит мой с ObjectNormalizer просто неверно сконфигурирован.
спасибо
Спасибо, Дмитрий.
Вот я и добрался до 72-го видео. Всё, очень подробно, супер!
Есть понимание когда будут опубликованы следующие видео?
Можно пойти дальше. Экшены принимают сразу в параметрах команды и возвращают объекты. Тогда будет меньше болерплейт кода в экшенах.
Я бы предложил дтошки респонсов реквестов генерить через свагер, а для очереди использовать протобаф описание. Спасибо за ролик как всегда почерпнул для себя какие то нюансы.
Да, если сначала придумывают схему API, то удобнее сделать файл со схемой и по нему генерировать DTO для бэкенда и фронтенда.
Есть, 72-й урок пройден) Спасибо за материал, пойду смотреть другие скринкасты.
$obj = new \stdClass();
$obj->lol = 'kek';
$serializer = new Serializer([
new PropertyNormalizer(),
], [
new XmlEncoder(),
new JsonEncoder()
]);
$data = $serializer->normalize($obj, 'json');
Я взял дефолтные енкодеры и нормалайзер. Я ожидал, что в $data придет JSON, но почему то сконвертилось в массив. Оно вообще независимо от параметра формата конвертит все в массив. Это так и должно быть? Спасибо.
Да, всё так:
normalize конвертирует объект в массивencode собирает из массива JSONserialize вызывая normalize и encode перегоняет объект в JSONТак что вместо normalize вызывайте serialize.
Здравствуйте, когда примерно будет продолжение серии slim/react?
Переводы бы еще добавить для этих ошибок
Можно добавить. Но в отличие от ошибок валидации, которые выводятся пользователю, ошибки десериализации увидит только программист, который неверно спрограммировал запрос для API.
Дмитрий, сможете подсказать как обновить Serializer на использование symfony/serializer 6.3?
Когда вернёмся к коду все компоненты обновим.
Ура! Подходим стремительными темпами ближе к домену. Выходы стали чаще! Супер! Так держать))