Symfony 3:如何在具有大量对象的 Form 中实现 EntityType?

Symfony 3: How can I implement an EntityType in Form with a lot of objects?

我有一个实体 City,其中存储了超过 30000 个对象。用户可以添加具有 ManyToOneCity 关系的 Address 对象。 但是在Form构建过程中,<input> type radio or select 的渲染不适合对象的数量...

我使用以下实现代码(它是一个片段):

public function buildForm(FormBuilderInterface $builder, array $options)
{
  /* Pattern to get cities */
  $pattern = 'Bor%';  //I use this filter to reduce the number of objects but not sufficient

  $builder
    ->add('city', EntityType::class, array(
      'class'        => 'AppPlatformBundle:City',
      'choice_label' => 'name',
      'multiple'     => false,
      'expanded'     => true,
      'query_builder'=> function(CityRepository $repository) use($pattern) {
        return $repository->getCitiesWithPattern($pattern);
      }));
}

我认为解决方案是使用 TextType,用户可以在开始键入任何内容时选择建议。但是我不知道如何实现这个。

请问你有办法解决我的问题吗?

谢谢

通过以下步骤:

  1. 创建继承自简单 TextType 的自定义表单类型
  2. 将此自定义表单类型与 javascript 自动完成插件和 ajax 调用一起使用
  3. 创建您的自定义操作以检索您对 select 框(由插件创建)的选择
  4. 在您的自定义表单类型中使用数据转换器来检索对象而不是值

非常感谢 Fabien。

我能够为我实施一个好的解决方案:)

所以对于任何对我的解决方案感兴趣的人:

我将城市字段定义为 HiddenField,例如:

  $builder
    ->add('city', HiddenType::class);

我使用Data TransformerCity对象转换成唯一的Id(对象的字段Id)

在 Twig 模板中,我实现了 jQuery-ui Autocomplete

在后端,我创建了一个路由,能够 return 一个 Json 响应,所有城市都由 jQuery 插件的 term 过滤。

在前端,我开发了一个 jquery 脚本,它附加了一个新字段 "city",类型为 Text 和自动完成操作。

收到响应后,我用 ID 类型 Hidden 填充字段 city