Класс FormFactory
Класс FormFactory отвечает за создание форм в Symfony.
Он получает тип формы первым параметром, данные формы вторым
параметром и массив опций третьим параметром. Сервис
FormFactory доступен через контейнер и используется
внутри AbstractController через метод createForm.
Класс предоставляет методы create, createBuilder,
createNamed и createNamedBuilder.
Синтаксис
use Symfony\Component\Form\FormFactoryInterface;
$factory->create(string $type, mixed $data = null, array $options = []): FormInterface
$factory->createBuilder(string $type, mixed $data = null, array $options = []): FormBuilderInterface
$factory->createNamed(string $name, string $type, mixed $data = null, array $options = []): FormInterface
$factory->createNamedBuilder(string $name, string $type, mixed $data = null, array $options = []): FormBuilderInterface
Пример
Давайте создадим простую форму через метод create:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Form\Extension\Core\Type\FormType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
class FormController extends AbstractController
{
public function index(): Response
{
$form = $this->createFormBuilder()
->add('name', TextType::class)
->add('save', SubmitType::class)
->getForm();
return $this->render('form/index.html.twig', [
'form' => $form->createView(),
]);
}
}
?>
Результат выполнения кода:
<form name="form">
<div>
<label for="form_name">Name</label>
<input type="text" id="form_name" name="form[name]">
</div>
<div>
<button type="submit" id="form_save" name="form[save]">Save</button>
</div>
</form>
Пример
Давайте создадим форму через метод create с готовым типом:
<?php
namespace App\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\FormBuilderInterface;
class ArticleType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('title', TextType::class)
->add('save', SubmitType::class);
}
}
?>
Теперь создадим эту форму в контроллере:
<?php
namespace App\Controller;
use App\Form\ArticleType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
class FormController extends AbstractController
{
public function index(): Response
{
$form = $this->createForm(ArticleType::class);
return $this->render('form/index.html.twig', [
'form' => $form->createView(),
]);
}
}
?>
Результат выполнения кода:
<form name="article">
<div>
<label for="article_title">Title</label>
<input type="text" id="article_title" name="article[title]">
</div>
<div>
<button type="submit" id="article_save" name="article[save]">Save</button>
</div>
</form>
Пример
Давайте используем метод createNamed и зададим
имя формы вручную:
<?php
namespace App\Controller;
use App\Form\ArticleType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
class FormController extends AbstractController
{
public function index(): Response
{
$form = $this->get('form.factory')->createNamed('custom', ArticleType::class);
return $this->render('form/index.html.twig', [
'form' => $form->createView(),
]);
}
}
?>
Результат выполнения кода:
<form name="custom">
<div>
<label for="custom_title">Title</label>
<input type="text" id="custom_title" name="custom[title]">
</div>
<div>
<button type="submit" id="custom_save" name="custom[save]">Save</button>
</div>
</form>
Пример
Давайте получим строитель формы через метод
createBuilder и добавим поля динамически:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
class FormController extends AbstractController
{
public function index(): Response
{
$builder = $this->container->get('form.factory')
->createBuilder(null, ['title' => 'abcde', 'count' => 5]);
$builder->add('title', TextType::class);
$builder->add('count', IntegerType::class);
$builder->add('save', SubmitType::class);
$form = $builder->getForm();
return $this->render('form/index.html.twig', [
'form' => $form->createView(),
]);
}
}
?>
Результат выполнения кода:
<form name="form">
<div>
<label for="form_title">Title</label>
<input type="text" id="form_title" name="form[title]" value="abcde">
</div>
<div>
<label for="form_count">Count</label>
<input type="number" id="form_count" name="form[count]" value="5">
</div>
<div>
<button type="submit" id="form_save" name="form[save]">Save</button>
</div>
</form>
Смотрите также
-
класс
Form,
который представляет готовую форму -
метод
createView,
который создаёт представление формы для Twig -
метод
handleRequest,
который обрабатывает отправленные данные формы -
класс
FormFactory,
который создаёт формы и строители форм