Преобразовать настроенный тип формы Symfony из GET в POST
У меня есть контроллер для запуска отчета. Есть два действия для контроллера:
- Действие для возврата HTML-страницы для отображения отчета
- Действие для возврата данных 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 типа форм, которые расширяют общий абстрактный класс?