Symfony 6: как передать json объект параметром в контроллер?

Для передачи JSON-объекта в качестве параметра в контроллер Symfony 6 можно воспользоваться несколькими способами. Вот два из них:

1. Использование аннотации @RequestBody:
С помощью аннотации @RequestBody в контроллере можно указать, что параметр должен быть получен из тела запроса и преобразован в объект. Для этого вам потребуется использовать объект Symfony Request, который будет обрабатывать запрос. Вот пример кода:

use SymfonyComponentHttpFoundationRequest;

...

/**
 * @Route("/your-route", methods={"POST"})
 */
public function yourControllerAction(Request $request)
{
    $data = json_decode($request->getContent(), true);

    // Далее вы можете использовать $data как обычный ассоциативный массив
    // Или преобразовать его в объект, используя сериализацию, например, при помощи JMS Serializer Bundle

    return new JsonResponse('Success');
}

В этом примере мы получаем тело запроса при помощи метода getContent() объекта Request, и затем декодируем его из JSON в PHP-массив при помощи json_decode().

2. Использование класса формы Symfony:
Symfony предоставляет мощный механизм работы с формами. С его помощью вы можете создать класс формы, который будет автоматически обрабатывать и валидировать данные из запроса. Вот пример кода:

use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentFormExtensionCoreTypeTextType;

...

/**
 * @Route("/your-route", methods={"POST"})
 */
public function yourControllerAction(Request $request)
{
    $form = $this->createFormBuilder()
        ->add('myData', TextType::class)
        ->getForm();
        
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $data = $form->getData();

        // Далее вы можете использовать $data как обычный ассоциативный массив
        // Или преобразовать его в объект, используя сериализацию, например, при помощи JMS Serializer Bundle

        return new JsonResponse('Success');
    }

    return new JsonResponse('Error');
}

В этом примере мы создаем экземпляр класса формы с помощью createFormBuilder(), добавляем поле myData в форму, и затем обрабатываем запрос вызовом handleRequest(). Если форма была отправлена и данные прошли валидацию, мы можем получить эти данные при помощи getData().