Преобразовать настроенный тип формы Symfony из GET в POST

У меня есть контроллер для запуска отчета. Есть два действия для контроллера:

  1. Действие для возврата HTML-страницы для отображения отчета
  2. Действие для возврата данных JSON для отчета

Когда пользователь отправляет форму на странице HTML, страница будет перезагружена с соответствующими JavaScript и HTML для размещения данных отчета, а затем выполнит запрос AJAX для получения данных отчета (с использованием лимита / смещения). DataTables специально используется для этого.

Оба действия контроллера будут использовать один и тот же тип формы для обработки запросов.

Когда пользователь отправляет форму, я хотел бы, чтобы это было GET. Однако, когда сделан запрос AJAX, я бы хотел, чтобы это был POST.

Я бы предпочел не преобразовывать запрос GET в POST в контроллере, чтобы тип формы мог его принять. Я бы предпочел, чтобы я мог переключить Тип формы с принятия GET на принятие POST из контроллера.

Для иллюстрации ниже приведен довольно подробный пример. Я хочу иметь возможность изменить метод формы в \MyReportController::reportDataAction() поэтому он примет POST там, где в противном случае он будет принимать только GET.

<?php

class MyReportController extends BaseController
{
    public function reportPageAction(Request $request)
    {
        $report = $this->getReport();
        $form = $this->createForm(ReportType::class, $report); // Pre-configured to accept GET
        $form->handleRequest($request);

        $responseContext = [];

        if ($form->isSubmitted() && $form->isValid()) {
            $responseContext['report_schema'] = $report->getSchema();
            $responseContext['ajax'] = [
                    // This will cause AJAX request to be the same as the current request exept to a different endpoint and as a POST.
                    'url' => $this->router->generate('my_report_data'),
                    'data' => [$form->getName() => $request->query->get($form->getName())],
                    'type' => 'POST'
            ];
        }

        $response = $this->renderResponse(
            'my_report.html.twig',
            $responseContext
        );

        return $response;
    }

    public function reportDataAction(Request $request)
    {
        $report = $this->getReport();
        $form = $this->createForm(ReportType::class, $report); // Pre-configured to accept GET
        // !!! HERE I would like to change the form to accept POST before handling the request.
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $reportData = $report->fetchData();
        }

        $response = $this->createResponse(
            json_encode($reportData, JSON_PRETTY_PRINT),
            Response::HTTP_OK,
            [
                'Content-Type' => 'application/json'
            ]
        );

        return $response;
    }
}

Это возможно? Или мне нужно будет создать 2 типа форм, которые расширяют общий абстрактный класс?

0 ответов

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