Как изменить действие и метод формы

Дата обновления перевода 2023-07-06

Как изменить действие и метод формы

По умолчанию, форма будет отправлена через запрос HTTP POST по тому же URL, по которому она была отображена. Иногда вам нужно будет изменить эти параметры. Вы можете сделать это несколькими разными способами.

Если вы используете FormBuilder, чтобы построить вашу форму, вы можете использовать setAction() и setMethod():

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// src/Controller/DefaultController.php
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;

class DefaultController extends Controller
{
    public function new()
    {
        $form = $this->createFormBuilder($task)
            ->setAction($this->generateUrl('target_route'))
            ->setMethod('GET')
            ->add('task', TextType::class)
            ->add('dueDate', DateType::class)
            ->add('save', SubmitType::class)
            ->getForm();

        // ...
    }
}

Note

Этот пример предполагает, что вы создали маршрут под названием target_route, который указывает на контроллер, обрабатывающий форму.

При использовании класса типа формы, вы можете передать действие и метод в качестве опций формы:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// src/Controller/DefaultController.php
namespace App\Controller;

use App\Form\TaskType;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class DefaultController extends Controller
{
    public function new()
    {
        // ...

        $form = $this->createForm(TaskType::class, $task, array(
            'action' => $this->generateUrl('target_route'),
            'method' => 'GET',
        ));

        // ...
    }
}

Наконец, вы можете переопределить действие и метод в шаблоне, передав их в функции помощнка form_start() или form():

1
2
{# templates/default/new.html.twig #}
{{ form_start(form, {'action': path('target_route'), 'method': 'GET'}) }}

Note

Если метод формы не GET или POST, а PUT, PATCH или DELETE, Symfony вставит спрятанное поле с именем _method, которое хранит этот метод. Форма будет отправлена в нормальном запросе POST, но маршрутизатор Symfony способен определить параметр _method и интерпретирует его как запрос PUT, PATCH или DELETE. Смотрите опцию .