MapRequestPayload не может получить доступ к информации через дефис

У меня есть приложение на 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, как показано здесь.

Olivier 02.04.2024 09:38

Это полностью работает. Я думал, что другое имя через дефис он не расшифрует, но структура у него есть.

GrzeGab 03.04.2024 07:50
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
118
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Использование 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)

Другие вопросы по теме