@sl0

Можно ли программно создать DTO и провалидировать его?

Суть такова: есть сервис для опросов. Админ составляет опрос выбирая тип вопроса, варианты ответа и т.д. По этим вопросам генерируется форма, которую заполняет пользователь. Вопросы могут быть разных типов (обычные текстовые, с выбором чекбоксы/радиобатоны, файлы и т.д.
На стороне сайта все работает, но надо сделать api для этого сервиса. И вот тут проблема. Обычно я делают dto для таких целей, которую потом валидирую. Но в этом случае я не могу ее создать, т.к. не знаю заранее сколько вопросов будет и какого они будут типа. Нужно как-то динамически создать dto на основе имеющихся вопросов и затем провалидировать ответы пользователя. Или может есть какой другой способ по-проще?

Пример вопросов:
"questions": [
            {
                "id"         : 1,
                "title"      : "question 1",
                "constraints": {
                    "NotBlank": true
                },
                "type"       : "TextType"
            },
            {
                "id"         : 2,
                "title"      : "question 2",
                "constraints": {
                    "NotBlank": true
                },
                "type"       : "TextAreaType"
            },
            {
                "id"         : 3,
                "title"      : "question 3 (select)",
                "constraints": {
                    "NotBlank": true
                },
                "choices"    : {
                    "new0": {
                        "value": "first option"
                    },
                    "new1": {
                        "value": "second option"
                    },
                    "new3": {
                        "value": "third option"
                    }
                },
                "type"       : "ChoiceType"
            },
            {
                "id"         : 6,
                "title"      : "question 3 (checkboxes)",
                "constraints": {
                    "NotBlank": true
                },
                "choices"    : {
                    "new0": {
                        "value": "first option"
                    },
                    "new1": {
                        "value": "second option"
                    },
                    "new3": {
                        "value": "third option"
                    }
                },
                "type"       : "CheckboxChoiceType"
            },
            {
                "id"         : 12,
                "title"      : "Image",
                "constraints": {
                    "NotNull": true
                },
                "choices"    : null,
                "type"       : "ImageType"
            }
        ]


Пример ответов:
"answers"       : {
    "1": "text",
    "2": "a lot of text",
    "3": "first option",
    "6" : [
      {"0" : "first option"},
      {"1" : "third option"}
    ],
    "12":  "data:@file/jpeg;base64,..."
  }
  • Вопрос задан
  • 103 просмотра
Пригласить эксперта
Ответы на вопрос 2
uDenX
@uDenX
PHP Developer
Для каждого запроса/ответа лучше создать DTO

https://symfony.com/doc/current/components/seriali...
Ответ написан
Комментировать
Maksclub
@Maksclub
maksfedorov.ru
Бывают разного рода задачи, когда строятся DSL и приходится динамически создавать правила и объекты
Все зависит от ситуации и выбранного решения в реакцию на нее

Валидация ответов в данном случае будет зависеть от того, какой тип при создании вопроса будет выбран/сконструирован. Вот под эти правила и нужно вам делать валидацию, кажется тут не будет конечных ДТО, только промежуточные
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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