first-programmer
@first-programmer
Backend software engineer

Хорошо ли использовать DTO в качестве объекта реквеста для api?

Добрый вечер коллеги!

Из заголовка не совсем понятно, что я имею ввиду, поэтому поясню тут.

Мне посоветовали во время рефакторинга наших микросервисов использовать в api не кучу параметров у метода, а просто передавать туда DTO объект, дескать это унифицирует запросы к api. Вроде интересно, но не особо понимаю смысл (щас ночью уже не спросить коллегу). Во первых не понятно, как допустим на основе этого потом другие разработчики должны понимать что нужно передавать туда. Ну да, допустим это наш микросервис и я тут создам в микросервисе А DTO и буду слать его в метод микросервиса Б, типа могу посмотреть что за поля описаны в DTO, установить их и отправить объект. А, если допустим разработчик не знает ничего про этот DTO? Он просто видит что метод сервиса Б принимает какой-то DTO, а что там в нем должно быть не глядя код не поймешь.

Я не знаком пока особо с Symphony, но коллега мне написал, что типа можно использовать некий param конвертер для этих целей. Я стал гуглить что это такое и нашел только в отношении симфони это выражение и как я понимаю на Yii это не перенести, тут все ручками нужно делать, то есть создавать эти DTO. Да и если бы все таки можно было бы, я честно говоря, не вижу профита.

Если кто понимает, что коллега имел ввиду и почему это вообще считается удобным, расскажите пожалуйста.
  • Вопрос задан
  • 362 просмотра
Решения вопроса 1
myks92
@myks92 Куратор тега PHP
Нашёл решение — пометь вопрос ответом!
Сложно понять Вашу картину и что имел ввиду Ваш коллега. Об этом лучше спросить самого коллегу. Однако постараюсь помыслить на эту тему...

1. Конкретно DTO не совсем применима к API в чистом виде и работе с ней. Более правильно в запрос кидать json, а вот этот json уже маппить на вашу DTO, в которой будет высокоуровневая валидация от симфони и php7.4. Пример И само DTO.

2. Так как у вас система микросервисная, то DTO передавать по сети точно не нужно. Вы можете использовать DTO внутри своего приложения, но не использовать его по сети. DTO позволяет Вам в сервис/хэндлер/команду передавать не сам Request и не кучу параметров, а своё DTO, которая должна создаваться на основе запроса. Таким образом вы отделяете слои и ответственности. При изменении названий параметров DTO не обязательно их менять в API и наоборот. Нет зависимости и это хорошо! Так же хорошо и для тестируемости.

3. Если вы упомянули ParamConverter это по сути конвектор параметров, но опять же на уровне приложения, а не между запросами сети) Об использовании его можно почитать в документации симфони. С помощью него можно указать в методе DTO, которую он принимает, а конвектор, написанный вами, знает как это DTO создать на основе ваших переданных данных. То есть вы не DTO передаёте в запрос, а те же параметры, просто этот конвектор делает вам из этих параметров DTO. Использовать его или нет - дело ваше. Вы правильно подметили, что в Yii2 такого нет. Можно заморочиться написать свой, но смысла от этого нет вообще) Использовать DTO я бы рекомендовал. Так как профит будет: разделение слоев, меньшая связанность и возможность валидации. А вот использовать конвектор - решение команды или разработчика. Оно позволяет вам создать вашу DTO на основе переданных параметров. Параметры никуда не денутся, они просто сразу лягут в DTO это один профит - чище код.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
glaphire
@glaphire Куратор тега PHP
PHP developer
DTO просто помогает отвязаться от прямой работы с сущностью/моделью и выносить туда всю предварительную инициализацию/обработку/валидацию, получается как дополнительный слой ответственности передачи данных, чтобы не решать это на уровне тех же моделей/сущностей или сервисов.
С DTO на разных сторонах двух микросервисов вопрос сложный)
ParamConverter (и ArgumentResolver) это дополнительные прослойки в жизненном цикле запроса симфони, это просто разруливатели сырых параметров запроса и их валидация/преобразование в объекты до этапа попадания в экшен контроллера. Судя по документации, в Yii2 такого функционала нет и действительно надо делать самому или упрощать его.
Ответ написан
Помимо уже перечисленного, переданный в публичный метод сервиса набор параметров зачастую продолжает гулять по приватным методам или компонентам сервиса, и делать это проще с одной DTO, чем с пачкой параметров.
Ответ написан
Ваш ответ на вопрос

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

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