Події форми
Дата оновлення перекладу 2025-08-25
Події форми
Компонент Form надає структурований прроцес, щоб дозволити вам налаштувати ваші форми, використовуючи компонент EventDispatcher. Використовуючи події форми, ви можете змінювати інформацію або поля на різних етапах робочого процесу: від наповнення форми до відправки даних з запиту.
Наприклад, якщо вам потрібно додати поле, залежно від значень запиту, ви можете
зареєструвати слухача подій до події FormEvents::PRE_SUBMIT таким чиномs:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
// ...
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
$listener = function (FormEvent $event): void {
// ...
};
$form = $formFactory->createBuilder()
// ... додати поля форми
->addEventListener(FormEvents::PRE_SUBMIT, $listener);
// ...
Робочий процес форми
У життєвому циклі форми є два моменти, коли дані форми можуть бути оновлені:
- Під час попереднього заповнення (
setData()) при створенні форми; - При обробці відправки форми (
handleRequest()) для оновлення даних форми на основі введених користувачем значень.
1) Попереднє заповнення форми (FormEvents::PRE_SET_DATA і FormEvents::POST_SET_DATA)
Під час попереднього заповення форми, оголошуються дві події, коли викликається метод
Form::setData():
FormEvents::PRE_SET_DATA і FormEvents::POST_SET_DATA.
A) Подія FormEvents::PRE_SET_DATA
Подія FormEvents::PRE_SET_DATA оголошується на початку методу Form::setData().
Вона використовується для зміни даних, наданих під час попереднього заповнення з
FormEvent::setData().
Метод Form::setData() заблоковано,
так як подія оголошується з нього і викличе виключення, якщо буде викликана зі слухача.
| ??? ????? | ???????? |
|---|---|
| ???? ????? | ???????? ????, ??????????? ? setData() |
| ???????? ???? ????? | null |
| ????????????? ???? ????? | null |
| ???? ????????? ????? | null |
See also
Побачити всі події форм одночасно ви можете в Інформаційній таблиці про події форм .
B) Подія FormEvents::POST_SET_DATA
Подія FormEvents::POST_SET_DATA оголошується наприкінці методу
Form::setData(). Ця
подія може бути використана для зміни форми, залежно від заповнених даних
(динамічне додавання або видалення полів).
| ??? ????? | ???????? |
|---|---|
| ???? ????? | ???????? ????, ??????????? ? setData() |
| ???????? ???? ????? | ???????? ????, ??????????? ? setData() |
| ????????????? ???? ????? | ???????? ????, ??????????? ?? ????????? ?????????? ????????????? |
| ???? ????????? ????? | ????????????? ????, ??????????? ?? ????????? ????????????? ????????? |
See also
Побачити всі події форм одночасно ви можете в Інформаційній таблиці про події форм .
2) Відправка форми (FormEvents::PRE_SUBMIT, FormEvents::SUBMIT і FormEvents::POST_SUBMIT)
При виклику методу Form::handleRequest()
або Form::submit(), оголошуються три події:
FormEvents::PRE_SUBMIT, FormEvents::SUBMIT, FormEvents::POST_SUBMIT.
A) Подія FormEvents::PRE_SUBMIT
Подія FormEvents::PRE_SUBMIT оголошується на початку методу
Form::submit().
Вона може бути використана для:
- Зміни даних із запиту, до відправки даних у форму;
- Додавання або видалення полів форми, до відправки даних у форму.
| ??? ????? | ???????? |
|---|---|
| ???? ????? | ???? ? ?????? |
| ???????? ???? ????? | ?? ? ????, ?? ? ? FormEvents::POST_SET_DATA |
| ????????????? ???? ????? | ?? ? ????, ?? ? ? FormEvents::POST_SET_DATA |
| ???? ????????? ????? | ?? ? ????, ?? ? ? FormEvents::POST_SET_DATA |
See also
Побачити всі події форм одночасно ви можете в Інформаційній таблиці про події форм .
B) Подія FormEvents::SUBMIT
Подія FormEvents::SUBMIT оголошується прямо перед тим, як метод
Form::submit() перетворює
нормалізовані дані на модельні дані та дані перегляду.
Вона може бути використана для зміни даних з нормалізованого представлення даних.
| ??? ????? | ???????? |
|---|---|
| ???? ????? | ???? ? ??????, ???????? ??????????? ?? ?????? ? ????????????? ????????????? |
| ???????? ???? ????? | ?? ? ????, ?? ? ? FormEvents::POST_SET_DATA |
| ????????????? ???? ????? | ?? ? ????, ?? ? ? FormEvents::POST_SET_DATA |
| ???? ????????? ????? | ?? ? ????, ?? ? ? FormEvents::POST_SET_DATA |
See also
Побачити всі події форм одночасно ви можете в Інформаційній таблиці про події форм .
Warning
На цьому етапі ви не можете додавати або видаляти поля з форми.
C) Подія FormEvents::POST_SUBMIT
Подія FormEvents::POST_SUBMIT оголошується після
Form::submit(), коли
були денормалізовані модельні дані та дані перегляду.
Вона може бути використана, щоб вилучати дані після денормалізації.
| ??? ????? | ???????? |
|---|---|
| ???? ????? | ????????????? ????, ??????????? ?? ????????? ????????????? ????????? |
| ???????? ???? ????? | ????????????? ????, ???????? ??????????? ?? ????????? ?????????? ????????????? |
| ????????????? ???? ????? | ???? ? ??????, ???????? ??????????? ? ?????? ?? ????????? ????????????? ????????? |
| ???? ????????? ????? | ????????????? ????, ??????????? ?? ????????? ????????????? ????????? |
See also
Побачити всі події форм одночасно ви можете в Інформаційній таблиці про події форм .
Warning
На цьому етапі ви не можете додавати або видаляти поля з форми.
Реєстрація слухачів або підписників подій
Для того, щоб мати можливість використовувати події форми, вам потрібно створити слухача або підписника подій та зареєструвати йогог у події.
Імʼя кожної події "форми" визначається як константа в класі FormEvents. Додатково, кожному зворотному виклику події (метод слухача або підписника) передається один аргумент, який є екземпляром класу FormEvent. Обʼєкт події містить посилання на поточний стан форми та поточні дані, що обробляються.
| ???? | ????????? FormEvents |
???? ????? |
|---|---|---|
form.pre_set_data |
FormEvents::PRE_SET_DATA |
???????? ???? |
form.post_set_data |
FormEvents::POST_SET_DATA |
???????? ???? |
form.pre_submit |
FormEvents::PRE_SUBMIT |
???? ?????? |
form.submit |
FormEvents::SUBMIT |
????????????? ???? |
form.post_submit |
FormEvents::POST_SUBMIT |
???? ????????? |
Слухачі подій
Слухач подій може бути будь-яким типом валідного викликаного.
Створення та привʼязка слухача подій - це дуже просто:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
// ...
use Symfony\Component\Form\Event\PreSubmitEvent;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormEvents;
$form = $formFactory->createBuilder()
->add('username', TextType::class)
->add('showEmail', CheckboxType::class)
->addEventListener(FormEvents::PRE_SUBMIT, function (PreSubmitEvent $event): void {
$user = $event->getData();
$form = $event->getForm();
if (!$user) {
return;
}
// Перевіряє, чи обрав користувач відображати його електронну пошту.
// Якщо дані були відправлені раніше, додаткове значення, включене
// у змінних запиту, повинно бути видалене.
if (isset($user['showEmail']) && $user['showEmail']) {
$form->add('email', EmailType::class);
} else {
unset($user['email']);
$event->setData($user);
}
})
->getForm();
// ...
Коли ви вже створити клас типу форми, ви можете використовувати один з його методів в якості зворотного виклику для кращої читаності:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
// src/Form/SubscriptionType.php
namespace App\Form;
use Symfony\Component\Form\Event\PreSetDataEvent;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormEvents;
// ...
class SubscriptionType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('username', TextType::class)
->add('showEmail', CheckboxType::class)
->addEventListener(
FormEvents::PRE_SET_DATA,
[$this, 'onPreSetData']
)
;
}
public function onPreSetData(PreSetDataEvent $event): void
{
// ...
}
}
Підписники подій
Підписники подій мають різні застосування:
- Покращення читаності;
- Прослуховування декількох подій;
Регрупування декількох слухачів всередині одного класу.
// src/Form/EventListener/AddEmailFieldListener.php namespace AppFormEventListener;
use SymfonyComponentEventDispatcherEventSubscriberInterface; use SymfonyComponentFormEventPreSetDataEvent; use SymfonyComponentFormEventPreSubmitEvent; use SymfonyComponentFormExtensionCoreTypeEmailType; use SymfonyComponentFormFormEvents;
class AddEmailFieldListener implements EventSubscriberInterface { public static function getSubscribedEvents(): array { return [ FormEvents::PRE_SET_DATA => 'onPreSetData', FormEvents::PRE_SUBMIT => 'onPreSubmit', ]; }
public function onPreSetData(PreSetDataEvent $event): void { $user = $event->getData(); $form = $event->getForm();
// Перевіряє, чи обрав користувач з початкових даних // відображати свою електронну пошту if (true === $user->isShowEmail()) { $form->add('email', EmailType::class); }
}
public function onPreSubmit(PreSubmitEvent $event): void { $user = $event->getData(); $form = $event->getForm();
- if (!$user) {
- return;
}
// Перевіряє, чи обрав користувач відображати свою електронну пошту. // Якщо дані були відправлені раніше, додаткове значення, включене // у змінних запиту, має бути видалене. if (isset($user['showEmail']) && $user['showEmail']) { $form->add('email', EmailType::class); } else { unset($user['email']); $event->setData($user); }
}
Для того, щоб зареєструвати підписника подій, використайте метод addEventSubscriber():
1 2 3 4 5 6 7 8 9 10 11 12 13
use App\Form\EventListener\AddEmailFieldListener;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
// ...
$form = $formFactory->createBuilder()
->add('username', TextType::class)
->add('showEmail', CheckboxType::class)
->addEventSubscriber(new AddEmailFieldListener())
->getForm();
// ...