У меня есть приложение на Symfony 6.4, где я использую атрибут MapRequestPayload для анализа входящих данных. До сих пор все работало нормально, но я начал использовать внешний сервис (mailgun) для получения некоторых данных, и возникла проблема с сопоставлением event-data переменной части. Я не могу изменить способ отправки мне данных. Поэтому каждый раз, когда я хочу использовать данные #[MapRequestPayload], в структуре не может быть дефиса, иначе они не будут сопоставлены.
Я получаю запрос с телом:
{
'signature': { ... },
'event-data': { ... }
Я пытаюсь отобразить это с помощью #[MapRequestPayload] UpdateEmailStatusInput.
Конструктор, который я использую в контроллере public function updateStatus(#[MapRequestPayload] UpdateEmailStatusInput $emailStatusInput)
class UpdateEmailStatusInput
{
public function __construct(
#[Assert\NotBlank] public array $signature,
#[Assert\NotBlank] public array $eventData,
) {
}
}
переменная подписи работает нормально, но eventData не работает (оно пустое):
signature: array:3 []
eventData: null
Я не могу создать переменную $event-data, потому что PHP считает, что это константные данные #event (минус).
Есть ли какая-то конфигурация или обходной путь, чтобы заставить его работать «из коробки»? На данный момент я использую обычную $request->getContent() для получения переменной event-data.
Это полностью работает. Я думал, что другое имя через дефис он не расшифрует, но структура у него есть.






Использование SerializedName, как предполагалось, решило проблему. Расшифровывается вся структура, даже имена с дефисом глубоко в структуре.
Итак, класс ввода теперь выглядит так:
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Serializer\Annotation\SerializedName;
class UpdateEmailStatusInput
{
public function __construct(
#[Assert\NotBlank]
public array $signature,
#[SerializedName('event-data')]
#[Assert\NotBlank]
public array $event,
) {
}
}
и вызывается из контроллера:
public function updateStatus(#[MapRequestPayload] UpdateEmailStatusInput $emailStatusInput)
Вы можете попробовать аннотацию
SerializedName, как показано здесь.