Symfony 3.1 - 如何为表单实体类型

时间:2016-09-01 08:10:02

标签: php doctrine-orm symfony symfony-forms formbuilder

我有一个表单类,我需要在表单事件(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']

0 个答案:

没有答案