Событие PRE_SET_DATA
Событие PRE_SET_DATA возникает в форме до того,
как данные будут установлены в поля через метод setData.
Это событие позволяет подготовить или изменить данные,
которые будут переданы в форму. Первым параметром
слушатель получает объект события PreSetDataEvent,
содержащий устанавливаемые данные и саму форму.
Синтаксис
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$data = $event->getData();
$form = $event->getForm();
});
Пример
Давайте создадим форму и подпишемся на событие PRE_SET_DATA,
чтобы изменить устанавливаемые данные:
<?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('title', TextType::class);
$builder->add('save', SubmitType::class);
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$data = $event->getData();
if ($data === null) {
return;
}
$data['title'] = strtoupper($data['title']);
$event->setData($data);
});
}
}
?>
Пример
Давайте выведем данные до и после их изменения в событии:
<?php
namespace App\Controller;
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', name: 'article_form')]
public function form(): Response
{
$data = ['title' => 'abcde'];
$form = $this->createForm(ArticleType::class, $data);
return new Response($form->getData()['title']);
}
}
?>
Результат выполнения кода:
"ABCDE"
Пример
Давайте добавим поле в форму динамически в зависимости от устанавливаемых данных:
<?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\IntegerType;
class ArticleType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder->add('title', TextType::class);
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$data = $event->getData();
$form = $event->getForm();
if ($data !== null && $data['title'] === 'article') {
$form->add('views', IntegerType::class);
}
});
}
}
?>
Если в форму передать массив ['title' => 'article'],
то в форме появится дополнительное поле views.
При другом значении title это поле добавлено не будет.
Смотрите также
-
событие
POST_SET_DATA,
которое возникает после установки данных формы -
событие
PRE_SUBMIT,
которое возникает до обработки отправленных данных -
класс
Form,
который представляет форму и управляет её данными -
метод
setData,
который устанавливает данные в форму