Новое в Symfony 7.2: Новая опция choice_lazy для ChoiceType
LazyChoiceLoader
и опция choice_lazy
для ChoiceType
улучшающие производительности полей выбора с большим количеством вариантов.- Pull Request: [DoctrineBridge][Form] Introducing new
LazyChoiceLoader
class andchoice_lazy
option forChoiceType
#52503 Yonel Ceruto
Поле 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.