Як використовувати функцію submit() для обробки відправки форм

Дата оновлення перекладу 2024-05-27

Як використовувати функцію submit() для обробки відправки форм

Рекомендованим способом обробки форм Symfony є використання методу handleRequest(), щоб виявити, коли форма була відправлена. Однак, ви також можете використати метод submit(), щоб мати більше контролю над тим, коли саме відправлена ваша форма, і які дані передаються у неї:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
// ...

public function new(Request $request): Response
{
    $task = new Task();
    $form = $this->createForm(TaskType::class, $task);

    if ($request->isMethod('POST')) {
        $form->submit($request->getPayload()->get($form->getName()));

        if ($form->isSubmitted() && $form->isValid()) {
        // виконати якусь дію...

            return $this->redirectToRoute('task_success');
        }
    }

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

Список полів, відправлених методом submit() повинен бути таким же, як і поля, визначені класом форми. Інакше ви побачите помилку валідації форми:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public function new(Request $request): Response
{
    // ...

    if ($request->isMethod('POST')) {
        // '$json' являє собою дані навантаження, відправлені React/Angular/Vue
        // злиття параметрів необхідно для відправки усіх полів форми
        $form->submit(array_merge($json, $request->request->all()));

        // ...
    }

    // ...
}

Tip

Форми, що складаються із вкладених полів, очікують масив у submit(). Ви також можете відправити індивідуальні поля, викликавши submit() напряму у полі:

1
$form->get('firstName')->submit('Fabien');

Tip

При відправленні форми через запит "PATCH", ви можете захотіти оновоити лище декілька з відправлених полів. Щоб досягти цього, ви можете передати submit() необовʼязковий булевий аргумент. Передача false видалить всі відсутні поля з обʼєкта форми. В іншому випадку, відсутні поля будуть встановлені як null.

Caution

Коли другий параметр $clearMissing - false, як у методі "PATCH", розширення валідації працюватиме лише з відправленими полями. Якщо потрібно валідувати основні дані, то це потрібно робити вручну, тобто, використовуючи валідатор:

1
2
// 'email' і 'username' додаються вручну, щоб форсувати їх валідацію
$form->submit(array_merge(['email' => null, 'username' => null], $request->getPayload()->all()), false);