Новое в Symfony 7.2: Новая опция choice_lazy для ChoiceType

Источник: «New in Symfony 7.2: Lazy Choice Loader»
В Symfony 7.2 представлен новый класс LazyChoiceLoader и опция choice_lazy для ChoiceType улучшающие производительности полей выбора с большим количеством вариантов.

Поле EntityType, определённое в Symfony Forms, позволяет представлять все значения, хранящиеся для сущности Doctrine, с помощью HTML-элемента <select> или набора радиокнопок, или чекбоксов. Оно расширяет поле ChoiceType, один из самых универсальных (и сложных) типов в Symfony Forms.

Самый большой недостаток EntityType заключается в том, что он может вызывать проблемы с производительностью при отображении сущности с большим количеством значений. Обычным решением является создание поля автозавершения с использованием комбинации PHP и JavaScript.

В Symfony 7.2 мы упростили эту задачу, введя LazyChoiceLoader, реализующий стратегию загрузки поля выбора по требованию. Вы можете использовать его в типах форм с помощью опции choice_lazy:

$formBuilder->add('user', EntityType::class, [
'class' => User::class,
'choice_lazy' => true,
]);

Внутри загрузчика список вариантов остаётся пустым до тех пор, пока значения не понадобятся (что позволяет избежать лишних запросов к базе данных). Когда значения формы предоставляются или отправляются, он извлекает и кэширует только необходимые варианты.

Фронтенд-часть, необходимая для динамического отображения вариантов выбора пользователю, по-прежнему не предоставляется. Для этого можно использовать поле автозаполнения из Symfony UX.

Дополнительные материалы

Предыдущая Статья

Не используйте одну и ту же модель для записи и чтения