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

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

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

  • Framework 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();
    
            // ...
        }
    }
    
  • Standalone Use
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    use Symfony\Component\Form\Forms;
    use Symfony\Component\Form\Extension\Core\Type\DateType;
    use Symfony\Component\Form\Extension\Core\Type\FormType;
    use Symfony\Component\Form\Extension\Core\Type\SubmitType;
    use Symfony\Component\Form\Extension\Core\Type\TextType;
    
    // ...
    
    $formFactoryBuilder = Forms::createFormFactoryBuilder();
    
    // Form factory builder configuration ...
    
    $formFactory = $formFactoryBuilder->getFormFactory();
    
    $form = $formFactory->createBuilder(FormType::class, $task)
        ->setAction('...')
        ->setMethod('GET')
        ->add('task', TextType::class)
        ->add('dueDate', DateType::class)
        ->add('save', SubmitType::class)
        ->getForm();
    

Note

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

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

  • Framework 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',
            ));
    
            // ...
        }
    }
    
  • Standalone Use
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    use App\Form\TaskType;
    use Symfony\Component\Form\Forms;
    
    $formFactoryBuilder = Forms::createFormFactoryBuilder();
    
    // Конфигурация конструктора фабрики форм ...
    
    $formFactory = $formFactoryBuilder->getFormFactory();
    
    $form = $formFactory->create(TaskType::class, $task, array(
        'action' => '...',
        'method' => 'GET',
    ));
    

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

  • Twig
    1
    2
    {# templates/default/new.html.twig #}
    {{ form_start(form, {'action': path('target_route'), 'method': 'GET'}) }}
    
  • PHP
    1
    2
    3
    4
    5
    <!-- templates/default/new.html.php -->
    <?php echo $view['form']->start($form, array(
        'action' => $view['router']->path('target_route'),
        'method' => 'GET',
    )) ?>
    

Note

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

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.