我有一个表单类,我需要填充表单事件(FormEvents :: POST_SET_DATA) .

对于文本类型非常简单:

$form->get("fieldName")->setData("stringValue");

对于实体类型,这不起作用:

$form->get("fieldName")->setData(array("val1", "val2", "val3"));

我认为我必须先实例化实体,然后以这种方式设置数据:

$entity1 = $this->getDoctrine()->getRepository("AcmeBundle:MyEntity")->find("val1");
$entity2 = $this->getDoctrine()->getRepository("AcmeBundle:MyEntity")->find("val2");
$entity3 = $this->getDoctrine()->getRepository("AcmeBundle:MyEntity")->find("val3");
$form->get("fieldName")->setData(array($entity1, $entity2, $entity3));

这样它可以工作,但我必须在FormEventSubscriber中注入EntityManager,我需要首先知道entityType .

1)这是正确的方法吗?

2)我如何从FormBuilder类中检索实体的类型?

我可以用这种方式检索实体类型:

$form->get ( "fieldName" )->getConfig()->getAttributes()['data_collector/passed_options']['class']

提前致谢

嗨@dragoste,谢谢你的回复 . 我的目标是在显示之前填充(服务器端)前一个值的表单字段 . 我认为使用表单事件是实现我的目标的最佳方式(我正在使用FormEvents :: POST_SET_DATA事件),但是当我想填充这种字段时我遇到了问题:

...
    $builder->add("manyToManyField", EntityType::class, array (
            "class" => "AcmeBundle:TestEntity",
            "choice_label" => "id",
            "multiple" => true 
    ))

在EventSubscriber类我必须做一些事情,如:

public function onFormSetDataPre(FormEvent $event){
          $form = $event->getForm();
          $field= $form->get("manyToManyField");
          $field->setData($prevValue);
}

我的问题是在EventSubscriber中,$ prevValue是实体的ID . 如果我直接设置ID它不起作用 . 在setData()中,我必须传递实体,传递实体我必须从数据库中获取它 . 我的问题是:

1)从数据库中获取它是正确的)

2)我获得实体存储库的方式是正确的吗?

$field->getConfig()->getAttributes()['data_collector/passed_options']['class']