svisch
@svisch

Как правильно в Symfony десериализовать Request в DTO, а последний потом в сущность?

Здравствуйте. Задался вопросом как правильно с точки зрения доступных инструментов, кода и архитектуры оптимально преобразовать Request через DTO в сущность.
Допустим есть запрос с параметрами:
{
"name": "Vasya",
"age": 18,
"town": 1
}

DTO cо свойствами:
string $name;
int $age;
App\Entity\Town $town;

и сущность User с некоторыми свойствами, включая те, что есть в DTO.

Хотелось бы узнать ваше мнение как лучше:
1. Из объекта Request параметры запроса на DTO. Если с простыми типами данных все понятно (десериализовать запрос), то как быть с объектами в свойствах (они же отношения в сущностях) где town 1 надо преобразовать $townRepository->find(1)?
2. Как после выполнения п.1, имея заполненный DTO данными запроса, смаппить эти данные на сущность. Писать самому маппер или просто в котнроллере делать типа $user-setAge($DTO->getAge());

Интересует ответ на вопрос с точки зрения лучших практик.
Видел реализации на базе кастомного ParamConvertera. Думаю, также, что можно повесить обработчик события на запрос и там как-то обрабатывать Request, но не уверен, что это правильно. Хотелось сократить время на набивании ошибок и сразу пойти по правильному поту) Понимаю, что есть библиотеки, но помимо советов их хотелось бы узнать и подноготную этого процесса на пальцах. В общем буду рад любым рекомендациям и советам. )
  • Вопрос задан
  • 100 просмотров
Решения вопроса 1
Как человек, который в своё время так переусложнял код, что потом сам не понимал, что и где в проекте происходит, посоветую вам использовать самый лучший принцип на свете - "KISS"

Поэтому, ничего сложного пока не выдумывайте, поверьте, вы всегда сможете потом всё усложнить)))

Я бы сделал так:

  • В контроллере сериализуем JSON в DTO ( можно вообще вот так https://symfony.com/blog/new-in-symfony-6-3-mappin... )
  • Далее создаёс сервис, который будет нашим маппером, и который будет иметь 2 метода "fromDtoToEntity" и "fromEntityToDto", и он будет заниматься всеми преобразованиями туда-сюда.
  • В этом маппере пишем наитупейшую логику, как вы и писали $user-setAge($DTO->getAge());
  • Отдаём клиенту ответ из контроллера


Этот вариант максимально прозрачен и сильно сэкономит вам время при дебаге, потому что вы в два клика сможете найти всю логику.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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