Новое в Symfony 5.3: Помощник обработчика форм

Рекомендуемый способ обработки форм Symfony — использовать одно действие как для рендеринга формы, так и для обработки отправки формы.

Вот как это выглядит на практике:

// src/Controller/ConferenceController.php
// ...
#[Route('/{id}/edit', name: 'conference_edit', methods: ['GET', 'POST'])]
public function edit(Request $request, Conference $conference): Response
{
    $form = $this->createForm(ConferenceType::class, $conference);

    $form->handleRequest($request);
    if ($form->isSubmitted() && $form->isValid()) {
        // do something with the $conference object
        // (e.g. persist it in the database)

        return $this->redirectToRoute('conference_show', [
            'id' => $conference->getId(),
        ]);
    }

    return $this->render('conference/edit.html.twig', [
        'form' => $form->createView(),
    ]);
}

При использовании библиотек, таких как Symfony UX Turbo, этой простой обработки формы недостаточно, и вы должны строго следовать протоколу HTTP (например, если форма отправлена, но недействительна, ответ должен иметь код состояния HTTP 422).

Чтобы упростить обработку форм в этих случаях, Symfony 5.3 добавляет новый (необязательный) помощник для рендеринга форм. Этот помощник определен в базовом контроллере AbstractController как новый метод с именем renderForm().

Вот как должны быть записаны последние строки предыдущего примера при использовании нового помощника:

// src/Controller/ConferenceController.php
// ...

    return $this->renderForm('conference/edit.html.twig', [
        'form' => $form,
    ]);
}

Сигнатура метода renderForm() такая же, как и у метода render():

renderForm(
    string $view,
    array $parameters = [],
    Response $response = null
): Response

Этот метод отображает данную форму (он вызывает $form->createView() внутри) и устанавливает код состояния 422, когда форма отправлена и недействительна.

Аргумент $parameters – это список переменных, переданных в шаблон Twig, а необязательный объект $response позволяет вам настроить определенные свойства возвращаемого ответа (например, его параметры кеширования).