Класс Form
Класс Form - это центральный объект при работе с формами в Symfony. Он создаётся через FormFactory или с помощью метода createForm в контроллере. Объект формы хранит в себе дочерние поля, данные, привязанные к полям, ошибки валидации и конфигурацию. Класс Form реализует интерфейс FormInterface и предоставляет методы для обработки запроса, проверки валидности, получения данных и рендеринга представления. Первым параметром при создании формы обычно передаётся тип формы (например, FormType), вторым - начальные данные, третьим - массив опций.
Синтаксис
<?php
$form = $this->createForm(FormType::class, $data, $options);
?>
Пример
Давайте создадим простую форму с одним текстовым полем и выведем её в Twig-шаблоне:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentFormExtensionCoreTypeTextType;
use SymfonyComponentFormExtensionCoreTypeSubmitType;
use SymfonyComponentFormExtensionCoreTypeFormType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/form', name: 'article_form')]
public function form(): Response
{
$form = $this->createFormBuilder()
->add('title', TextType::class)
->add('save', SubmitType::class, ['label' => 'Create'])
->getForm();
return $this->render('article/form.html.twig', [
'form' => $form->createView(),
]);
}
}
?>
Файл Twig-шаблона:
{{ form_start(form) }}
{{ form_row(form.title) }}
{{ 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><button type="submit" id="form_save" name="form[save]">Create</button></div>
</form>
Пример
Давайте обработаем отправку формы и проверим её валидность:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentFormExtensionCoreTypeTextType;
use SymfonyComponentFormExtensionCoreTypeSubmitType;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/form', name: 'article_form')]
public function form(Request $request): Response
{
$form = $this->createFormBuilder()
->add('title', TextType::class)
->add('save', SubmitType::class, ['label' => 'Create'])
->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
return new Response('Form is valid. Title: ' . $data['title']);
}
return $this->render('article/form.html.twig', [
'form' => $form->createView(),
]);
}
}
?>
Результат выполнения кода после отправки формы с заголовком 'abcde':
"Form is valid. Title: abcde"
Пример
Давайте получим данные формы и выведем их в виде массива:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentFormExtensionCoreTypeTextType;
use SymfonyComponentFormExtensionCoreTypeIntegerType;
use SymfonyComponentFormExtensionCoreTypeFormType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/form-data', name: 'article_form_data')]
public function formData(): Response
{
$form = $this->createFormBuilder()
->add('title', TextType::class, ['data' => 'article'])
->add('count', IntegerType::class, ['data' => 5])
->getForm();
$data = $form->getData();
return new Response(json_encode($data));
}
}
?>
Результат выполнения кода:
{"title":"article","count":5}
Смотрите также
-
метод
handleRequest,
который обрабатывает HTTP-запрос и заполняет форму данными -
метод
isValid,
который проверяет валидность отправленной формы -
метод
getData,
который возвращает данные, привязанные к форме -
класс
FormFactory,
который создаёт объекты форм