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