Событие POST_SUBMIT
Событие POST_SUBMIT относится к событиям формы и вызывается после того, как форма была отправлена и обработана. Оно возникает после события SUBMIT, когда данные уже записаны в форму, но ещё до того, как форма будет возвращена для отображения. Это событие удобно использовать для выполнения действий, зависящих от итогового состояния формы, например, для сохранения данных в базу или изменения других полей.
Обработчик события получает объект FormEvent, через который можно получить доступ к самой форме и к исходным данным. Изменение данных на этом этапе не влияет на уже выполненные проверки, но может быть использовано для дальнейшей логики. Событие доступно через константу FormEvents::POST_SUBMIT.
Синтаксис
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
$builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
// logic
});
Пример
Давайте создадим форму с полем text и повесим на событие POST_SUBMIT обработчик, который выводит сообщение после успешной отправки:
<?php
namespace App\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
class ArticleType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('text', TextType::class)
->add('save', SubmitType::class)
->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
$form = $event->getForm();
if ($form->isValid()) {
echo "form is valid";
}
});
}
}
?>
Пример
Давайте через событие POST_SUBMIT изменим значение другого поля после отправки формы:
<?php
namespace App\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
class ArticleType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('text', TextType::class)
->add('status', TextType::class)
->add('save', SubmitType::class)
->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
$form = $event->getForm();
if ($form->isValid()) {
$form->get('status')->setData('processed');
}
});
}
}
?>
После отправки формы поле status получит значение 'processed'.
Пример
Давайте используем событие POST_SUBMIT в контроллере для сохранения данных после успешной валидации:
<?php
namespace App\Controller;
use App\Form\ArticleType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
class ArticleController extends AbstractController
{
public function new(Request $request): Response
{
$form = $this->createForm(ArticleType::class);
$form->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
$form = $event->getForm();
if ($form->isValid()) {
// save data
}
});
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
return new Response('saved');
}
return $this->render('article/new.html.twig', [
'form' => $form->createView(),
]);
}
}
?>
Результат выполнения кода при успешной отправке:
"saved"
Смотрите также
-
событие
PRE_SUBMIT,
которое срабатывает перед обработкой отправленной формы -
событие
SUBMIT,
которое срабатывает в момент обработки отправленной формы -
метод
isValid,
который проверяет валидность формы -
метод
getData,
который возвращает данные формы