How to Use the submit() Function to Handle Form Submissions

The recommended way of processing Symfony forms is to use the handleRequest() method to detect when the form has been submitted. However, you can also use the submit() method to have better control over when exactly your form is submitted and what data is passed to it:

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()) {
            // perform some action...

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

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

The list of fields submitted with the submit() method must be the same as the fields defined by the form class. Otherwise, you'll see a form validation error:

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' represents payload data sent by React/Angular/Vue
        // the merge of parameters is needed to submit all form fields
        $form->submit(array_merge($json, $request->request->all()));

        // ...
    }

    // ...
}

Tip

ヒント

Forms consisting of nested fields expect an array in submit(). You can also submit individual fields by calling submit() directly on the field:

ネストされたフィールドで構成されるフォームは、配列 insubmit() を想定しています。フィールドで直接 submit() を呼び出して、個々のフィールドを送信することもできます。
1
$form->get('firstName')->submit('Fabien');

Tip

ヒント

When submitting a form via a "PATCH" request, you may want to update only a few submitted fields. To achieve this, you may pass an optional second boolean argument to submit(). Passing false will remove any missing fields within the form object. Otherwise, the missing fields will be set to null.

「PATCH」リクエストを介してフォームを送信する場合、いくつかの送信済みフィールドのみを更新したい場合があります。これを実現するには、オプションの 2 番目のブール引数を submit() に渡すことができます。 false を渡すと、フォーム オブジェクト内の不足しているフィールドが削除されます。それ以外の場合、不足しているフィールドは null に設定されます。

Caution

注意

When the second parameter $clearMissing is false, like with the "PATCH" method, the validation will only apply to the submitted fields. If you need to validate all the underlying data, add the required fields manually so that they are validated:

1
2
// 'email' and 'username' are added manually to force their validation
$form->submit(array_merge(['email' => null, 'username' => null], $request->request->all()), false);