Метод createForm
Метод createForm принадлежит классу AbstractController и позволяет быстро создать объект формы прямо в контроллере. Первым параметром передаётся класс типа формы (например, ArticleType), вторым - данные, которые нужно заполнить в форму (обычно сущность). Третьим параметром можно передать массив опций формы. Метод возвращает объект FormInterface, готовый к обработке запроса и рендерингу.
Синтаксис
$this->createForm(string $type, mixed $data = null, array $options = []): FormInterface
Пример
Давайте создадим простую форму для сущности Article и отрендерим её в шаблоне:
<?php
namespace App\Controller;
use App\Entity\Article;
use App\Form\ArticleType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article/new', name: 'article_new')]
public function new(): Response
{
$article = new Article();
$form = $this->createForm(ArticleType::class, $article);
return $this->render('article/new.html.twig', [
'form' => $form,
]);
}
}
?>
Результат выполнения кода - объект формы, переданный в шаблон:
{{ form_start(form) }}
{{ form_widget(form) }}
<button type="submit">Save</button>
{{ form_end(form) }}
Пример
Давайте обработаем отправку формы и сохраним данные через handleRequest:
<?php
namespace App\Controller;
use App\Entity\Article;
use App\Form\ArticleType;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article/new', name: 'article_new')]
public function new(Request $request, EntityManagerInterface $em): Response
{
$article = new Article();
$form = $this->createForm(ArticleType::class, $article);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em->persist($article);
$em->flush();
return $this->redirectToRoute('article_new');
}
return $this->render('article/new.html.twig', [
'form' => $form,
]);
}
}
?>
Результат выполнения кода после успешной отправки формы - перенаправление на тот же маршрут:
Redirect to /article/new
Пример
Давайте передадим дополнительные опции в форму через третий параметр:
<?php
namespace App\Controller;
use App\Entity\Article;
use App\Form\ArticleType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article/edit', name: 'article_edit')]
public function edit(): Response
{
$article = new Article();
$form = $this->createForm(ArticleType::class, $article, [
'action' => $this->generateUrl('article_new'),
'method' => 'POST',
]);
return $this->render('article/edit.html.twig', [
'form' => $form,
]);
}
}
?>
Результат выполнения кода - форма с заданным адресом отправки и методом POST:
<form action="/article/new" method="POST">
Смотрите также
-
класс
AbstractController,
который даёт доступ к методу createForm -
метод
createFormBuilder,
который создаёт форму без отдельного класса типа -
метод
render,
который рендерит шаблон с переданной формой -
метод
redirectToRoute,
который перенаправляет после успешной отправки формы