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

Дата обновления перевода 2022-01-17

Как использовать функцию 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->request->get($form->getName()));

        if ($form->isSubmitted() && $form->isValid()) {
        // выполнить какое-либо действие...

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

    return $this->renderForm('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->request->all()), false);