Як використовувати функцію 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);