Использование DTO и получение подресурса ORM с помощью uriVariable в API Platform/Symfony ⇐ Php
-
Гость
Использование DTO и получение подресурса ORM с помощью uriVariable в API Platform/Symfony
Я использую платформу API 3 с Symfony 6 для создания API. У меня есть подписчик объекта ORM. Чтобы изменить определенные поля подписчика, я хочу использовать PUT с объектом передачи данных (DTO). Поскольку мне нужен базовый подписчик и я хочу, чтобы платформа API проверяла, существует ли этот подписчик (и возвращала 404, если это не так), и автоматически извлекала его (для использования в StateProcessor), я пытаюсь передать идентификатор подписчика в URL как uriVariable (в URI он называется subscriberId, но фактический идентификатор в Subscriber — это просто id).
Однако это всегда возвращает 404, предположительно потому, что он пытается получить объект SaveSubscriberDetails DTO с идентификатором подписчика, который не может работать, поскольку это не объект ORM, который где-либо сохраняется. Маршрут API существует. Когда я удаляю uriVariable в конфигурации ApiResource, я достигаю процессора состояния (проверено отладкой). Когда я оставляю его включенным, я никогда не дохожу до процессора состояний. Подписчик с идентификатором, который я передаю в URL-адресе, существует.
Моя попытка:
#[ApiResource( uriTemplate: '/subscriber/{subscriberId}/saveDetails', операции: [ новый Put (вход: SaveSubscriberDetails::class, процессор: SaveSubscriberDetailsProcessor::class), ], uriVariables: [ 'subscriberId' => новая ссылка( fromProperty: 'id', fromClass: Подписчик::класс ), ], вывод: SaveSubscriberDetails::class )] Я делаю что-то принципиально неправильное?
[*]Может быть, я неправильно использую атрибут «Ссылка»? [*]Нужно ли мне добавлять идентификатор частного свойства subscriberId типа int или подписчика свойства типа Subscriber в мой DTO SaveSubscriberDetails, чтобы ссылаться на него? [*]Может быть, мне нужно настроить процесс десериализации, в результате которого создается объект SaveSubscriberDetails? [*]Могу/должен ли я просто передать uriVariable subscriberId и сказать ему вообще не интерпретировать его, а вместо этого просто получить базовый объект Subscriber из базы данных в процессоре состояния SaveSubscriberDetailsProcessor?
Я использую платформу API 3 с Symfony 6 для создания API. У меня есть подписчик объекта ORM. Чтобы изменить определенные поля подписчика, я хочу использовать PUT с объектом передачи данных (DTO). Поскольку мне нужен базовый подписчик и я хочу, чтобы платформа API проверяла, существует ли этот подписчик (и возвращала 404, если это не так), и автоматически извлекала его (для использования в StateProcessor), я пытаюсь передать идентификатор подписчика в URL как uriVariable (в URI он называется subscriberId, но фактический идентификатор в Subscriber — это просто id).
Однако это всегда возвращает 404, предположительно потому, что он пытается получить объект SaveSubscriberDetails DTO с идентификатором подписчика, который не может работать, поскольку это не объект ORM, который где-либо сохраняется. Маршрут API существует. Когда я удаляю uriVariable в конфигурации ApiResource, я достигаю процессора состояния (проверено отладкой). Когда я оставляю его включенным, я никогда не дохожу до процессора состояний. Подписчик с идентификатором, который я передаю в URL-адресе, существует.
Моя попытка:
#[ApiResource( uriTemplate: '/subscriber/{subscriberId}/saveDetails', операции: [ новый Put (вход: SaveSubscriberDetails::class, процессор: SaveSubscriberDetailsProcessor::class), ], uriVariables: [ 'subscriberId' => новая ссылка( fromProperty: 'id', fromClass: Подписчик::класс ), ], вывод: SaveSubscriberDetails::class )] Я делаю что-то принципиально неправильное?
[*]Может быть, я неправильно использую атрибут «Ссылка»? [*]Нужно ли мне добавлять идентификатор частного свойства subscriberId типа int или подписчика свойства типа Subscriber в мой DTO SaveSubscriberDetails, чтобы ссылаться на него? [*]Может быть, мне нужно настроить процесс десериализации, в результате которого создается объект SaveSubscriberDetails? [*]Могу/должен ли я просто передать uriVariable subscriberId и сказать ему вообще не интерпретировать его, а вместо этого просто получить базовый объект Subscriber из базы данных в процессоре состояния SaveSubscriberDetailsProcessor?
Мобильная версия