Класс FormBuilder
Класс FormBuilder - это основной инструмент для программного построения форм в Symfony.
Он предоставляет набор методов для добавления полей, настройки их типов и параметров.
Экземпляр класса создаётся через метод createBuilder фабрики форм или внутри контроллера
с помощью createFormBuilder. Каждое поле описывается именем, типом и массивом опций.
После добавления всех элементов вызывается метод getForm, возвращающий готовый объект формы.
Синтаксис
$builder = $this->createFormBuilder($data);
$builder->add('name', TextType::class, ['label' => 'Name']);
$form = $builder->getForm();
Пример
Давайте создадим простую форму с двумя полями - текстовым и числовым:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentFormExtensionCoreTypeTextType;
use SymfonyComponentFormExtensionCoreTypeIntegerType;
use SymfonyComponentFormExtensionCoreTypeSubmitType;
use SymfonyComponentHttpFoundationResponse;
class ArticleController extends AbstractController
{
public function index(): Response
{
$builder = $this->createFormBuilder();
$builder->add('title', TextType::class, ['label' => 'Title']);
$builder->add('count', IntegerType::class, ['label' => 'Count']);
$builder->add('save', SubmitType::class, ['label' => 'Save']);
$form = $builder->getForm();
return $this->render('article/index.html.twig', [
'form' => $form->createView(),
]);
}
}
?>
В шаблоне Twig выведем форму:
{{ form_start(form) }}
{{ form_row(form.title) }}
{{ form_row(form.count) }}
{{ form_row(form.save) }}
{{ form_end(form) }}
Результат выполнения кода:
<form name="form" method="post">
<div>
<label for="form_title">Title</label>
<input type="text" id="form_title" name="form[title]">
</div>
<div>
<label for="form_count">Count</label>
<input type="number" id="form_count" name="form[count]">
</div>
<div>
<button type="submit" id="form_save" name="form[save]">Save</button>
</div>
</form>
Пример
Давайте установим начальные данные для полей формы с помощью массива:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentFormExtensionCoreTypeTextType;
use SymfonyComponentFormExtensionCoreTypeIntegerType;
use SymfonyComponentHttpFoundationResponse;
class ArticleController extends AbstractController
{
public function index(): Response
{
$data = [
'title' => 'hello',
'count' => 5,
];
$builder = $this->createFormBuilder($data);
$builder->add('title', TextType::class);
$builder->add('count', IntegerType::class);
$form = $builder->getForm();
return $this->render('article/index.html.twig', [
'form' => $form->createView(),
]);
}
}
?>
После рендеринга поля будут заполнены переданными значениями:
в поле title появится строка 'hello', а в поле count - число 5.
<input type="text" id="form_title" name="form[title]" value="hello">
<input type="number" id="form_count" name="form[count]" value="5">