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

По умолчанию, форма будет отправлена через запрос 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
    // AppBundle/Controller/DefaultController.php
    namespace AppBundle\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 newAction()
        {
            $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();
    
    // Конфигурация строителя фабрики форм ...
    
    $formFactory = $formFactoryBuilder->getFormFactory();
    
    $form = $formFactory->createBuilder(FormType::class, $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
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    // AppBundle/Controller/DefaultController.php
    namespace AppBundle\Controller;
    
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use AppBundle\Form\TaskType;
    
    class DefaultController extends Controller
    {
        public function newAction()
        {
            // ...
    
            $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 Symfony\Component\Form\Forms;
    use AppBundle\Form\TaskType;
    
    $formFactoryBuilder = Forms::createFormFactoryBuilder();
    
    // Конфигурация строителя фабрики форм ...
    
    $formFactory = $formFactoryBuilder->getFormFactory();
    
    $form = $formFactory->create(TaskType::class, $task, array(
        'action' => $this->generateUrl('target_route'),
        'method' => 'GET',
    ));
    

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

  • Twig
    1
    2
    {# app/Resources/views/default/new.html.twig #}
    {{ form_start(form, {'action': path('target_route'), 'method': 'GET'}) }}
    
  • PHP
    1
    2
    3
    4
    5
    6
    7
    <!-- app/Resources/views/default/new.html.php -->
    <?php echo $view['form']->start($form, array(
        // Метод path() был представлен в Symfony 2.8. До версии 2.8,
        // вам нужно было использовать generate().
        '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.