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

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

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

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

  • Framework Use
  • Standalone Use
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, который указывает на контроллер, обрабатывающий форму.

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

  • Framework Use
  • Standalone Use
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():

  • Twig
  • PHP
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. Смотрите опцию Справочник конфигурации фреймворка (FrameworkBundle).