Создаем простую Symfony форму.

Итак, мы остановились на том, что у нас создан специальный класс для работы с формами TestFormType.php, который находится в папке Form. Этот класс содержит метод buildForm, который формирует структуру нашей формы:

<?php
namespace App\Form;
 
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
 
class TestFormType extends AbstractType {
 
    public function buildForm( FormBuilderInterface $builder, array $options ) {
        //parent::buildForm( $builder, $options ); // TODO: Change the autogenerated stub
    }
}

Внутри этого метода, как аргумент импортирован такой сервис, который называется FormBuilderInterface. Благодаря этому сервису, мы можем построить конструктив нашей формы.

Внутри сервиса $builder есть один основной метод, который мы будем использовать. Этот метод называется add. С его помощью мы добавляем те поля, которые будут в нашей форме.

Давайте с помощью этого сервиса добавим два поля в нушу форму.

public function buildForm( FormBuilderInterface $builder, array $options ) {
    $builder
        ->add('title')
        ->add('content')
 
}

По сути, конструктив формы у нас уже готов.

Но, пока на данном этапе это всего-лишь описание конструктива нашей формы. Если мы хотим описание этого конструктива перенести внутрь нашего вида, мы с вами должны сделать это через контроллер. 

Для того, чтобы нам отобразить внутри вида нашу форму нам нужно внутри контроллера сформировать эту самую форму, которую мы с вами создали из этого класса. 

Задача -  создать объект формы и передать его внутрь шаблонизатора Twig. 

Для того, чтобы создать объект формы, мы создаем переменную $form внутрь которой разместим результат выполнения метода createForm. В качестве параметра этого метода нужно передать тот класс формы, который мы хотим расширять. 

И теперь только остается передать внутрь шаблона Twig как параметр нашу форму.

 

class MainController extends AbstractController
{
...
        /**
     * @Route("/main", name="main")
     */
    public function index()
    {
        $form = $this->createForm(TestFormType::class);
        return $this->render('main/index.html.twig', [
            'form' => $form->createView()
        ]);
    }
…
}


Обратите внимание, что внутрь Twig шаблона передается не сама переменная $form, а метод createView, который подготовит объект с формой в формат понятный для шаблонизатора Twig. 

Каким же образом теперь отобразить переданный объект внутри шаблона Twig?

Открываем файл шаблона main/index.html.twig и вставляем туда следующую конструкцию кода.

{{ form_start(form, {'attr': {'novalidate': 'novalidate'}}) }}
    {{ form_widget(form) }}
    <button type="submit" class="button">Отправить</button>
{{ form_end(form) }}

 

form_start - это замена элементу <form>

form_end - замена элементу </form>

Параметр form соответствует той форме, которую мы передали из контроллера.

form_widget - выводит все поля, которые мы описали в классе формы. Вывод этих полей происходит в автоматическом режиме.

И элемент button - просто создает кнопку "Отправить", которая будет отправлять данные нашей формы.

Попробуйте тоже создать такой простой конструктив и отобразить форму у себя в шаблоне Twig.