Symfony表格:如何在条令实体表格中包含实体本身使用的可嵌入条令的表格

Symfony表格:如何在条令实体表格中包含实体本身使用的可嵌入条令的表格,symfony,doctrine-orm,doctrine,symfony-forms,value-objects,Symfony,Doctrine Orm,Doctrine,Symfony Forms,Value Objects,我有一个原则实体,它使用 我想创建一个表单来编辑实体和可嵌入 我的实体: /** * MyEntity * * @ORM\Table(name="my_entities") * @ORM\Entity(repositoryClass="\AppBundle\Entity\MyEntityRepository") * @ORM\HasLifecycleCallbacks */ class MyEntity { ... /** * @var MyEmbedda

我有一个原则
实体
,它使用

我想创建一个表单来编辑
实体
可嵌入

我的
实体

/**
 * MyEntity
 *
 * @ORM\Table(name="my_entities")
 * @ORM\Entity(repositoryClass="\AppBundle\Entity\MyEntityRepository")
 * @ORM\HasLifecycleCallbacks
 */
class MyEntity
{
    ...

    /**
     * @var MyEmbeddableInfo
     *
     * @ORM\Embedded(class="AppBundle\Entity\Embeddable\MyInfoEmbeddable")
     */
    private $myInfo;

    ...
My
可嵌入的

/**
 * @ORM\Embeddable
 */
class MyInfoEmbeddable
{
    /**
     * @var string
     *
     * @ORM\Column(name="info1", type="string", nullable=true)
     *
     * @Assert\NotBlank(groups={"setUp"})
     */
    private $info1;

    /**
     * @var string
     *
     * @ORM\Column(name="info2", type="string", nullable=true)
     *
     * @Assert\NotBlank(groups={"setUp"})
     */
    private $info2;

    /**
     * @var
     *
     * @ORM\Column(name="info3", type="string", nullable=true)
     *
     * @Assert\NotBlank(groups={"setUp"})
     */
    private $info3;

    ...
我尝试过的

我发现了这个问题,用户似乎也遇到了同样的问题,但不同的是,我从来没有得到过
警告
,因为我根本不理解为可嵌入对象创建表单的基本过程

我做了两个测试:一个直接将可嵌入对象传递给
MyEntityType
表单生成器,另一个创建
MyInfoType()
表单类型

测试1:直接通过可嵌入对象

这是my
MyEntityType
类的代码:

class MyEntityType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ...
            ->add('myInfo', 'entity', ['class' => '\AppBundle\Entity\Embeddable\MyInfoEmbeddable'])
            ...
    }

    public function getName()
    {
        return 'MyEntity';
    }
}
此解决方案引发
运行时异常

\AppBundle\Entity\embeddeble\myinfoembeddeble
似乎不是 管理主义实体。你忘了画地图了吗

测试2:通过
MyInfoType
对象

我做的第二个测试是使用表单类型(如中所建议的):

这是MyInfoType的代码:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('infoField1', 'text', ['required' => false])
        ->add('infoField2', 'text', ['required' => false])
        ->add('infoField3', 'choice', [
                'choices'   => [
                    '' => '',
                    'choice1' => 'Choice 1',
                    'choice2' => 'Choice 2',
                    'choice3' => 'Choice 3'
                ],
                'required' => false
            ]
        );
}
而是返回一个
Symfony\Component\PropertyAccess\Exception\NoSuchIndexException

无法从类型的对象读取索引
infoField1
AppBundle\Entity\embeddeble\myinfoembeddeble
,因为它没有 实现
\ArrayAccess

所以,这个解决方案也不起作用

我的目标是为MyEntity创建一个表单,并在此表单中创建要更新的字段


遵循哪个正确的程序?

在使用不同的
关键字进行了一些其他搜索后,我想出了帮助我解决问题的方法

我真的很接近解决方案。我只是省略了一个必需的参数来构建表单

解决方案是将
data\u class
参数传递给
FormBuilder
add()
方法:

...
$builder
    ->add('myInfo', new MyInfoType(), ['data_class' => '\AppBundle\Entity\Embeddable\MyInfoEmbeddable'])
...

而不是在你的主要形式:

$builder->add('myInfo', new MyInfoType(), 
['data_class' => '\AppBundle\Entity\Embeddable\MyInfoEmbeddable'])
您可以将其添加到MyInfoType表单中(我认为,该表单与可嵌入实体链接):

然后在主表单中简单调用可嵌入表单类型,如下所示:

$builder->add('myInfo', new MyInfoType())

我知道,这是一种猜测,但我建议将“data_class”属性从主窗体中调用的字段移到可嵌入窗体的configureOptions方法。你能写一个答案来澄清你的意思吗?
$builder->add($builder->create('myInfo',MyInfoType::class')
public function configureOptions(OptionsResolver $resolver)
{
   $resolver->setDefaults([
      'data_class' => '\AppBundle\Entity\Embeddable\MyInfoEmbeddable',
   ]);
}
$builder->add('myInfo', new MyInfoType())