Symfony形式:如何在教义实体形式中包含实体本身使用的可嵌入的教义形式



我有一个使用教义embeddable的教义Entity

我想创建一个表单来编辑EntityEmbeddable

Entity

/**
 * MyEntity
 *
 * @ORMTable(name="my_entities")
 * @ORMEntity(repositoryClass="AppBundleEntityMyEntityRepository")
 * @ORMHasLifecycleCallbacks
 */
class MyEntity
{
    ...
    /**
     * @var MyEmbeddableInfo
     *
     * @ORMEmbedded(class="AppBundleEntityEmbeddableMyInfoEmbeddable")
     */
    private $myInfo;
    ...

我的Embeddable

/**
 * @ORMEmbeddable
 */
class MyInfoEmbeddable
{
    /**
     * @var string
     *
     * @ORMColumn(name="info1", type="string", nullable=true)
     *
     * @AssertNotBlank(groups={"setUp"})
     */
    private $info1;
    /**
     * @var string
     *
     * @ORMColumn(name="info2", type="string", nullable=true)
     *
     * @AssertNotBlank(groups={"setUp"})
     */
    private $info2;
    /**
     * @var
     *
     * @ORMColumn(name="info3", type="string", nullable=true)
     *
     * @AssertNotBlank(groups={"setUp"})
     */
    private $info3;
    ...

我尝试过什么

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

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

测试 1:直接传递可嵌入对象

这是我MyEntityType类的代码:

class MyEntityType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ...
            ->add('myInfo', 'entity', ['class' => 'AppBundleEntityEmbeddableMyInfoEmbeddable'])
            ...
    }
    public function getName()
    {
        return 'MyEntity';
    }
}

此解决方案抛出一个RuntimeException

AppBundleEntityEmbeddableMyInfoEmbeddable似乎不是 一个受管理的教义实体。你忘了映射它吗?

测试 2:传递MyInfoType对象

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

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ...
            ->add('myInfo', new 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
            ]
        );
}

相反,这将返回一个SymfonyComponentPropertyAccessExceptionNoSuchIndexException

无法从类型的对象读取索引infoField1 AppBundleEntityEmbeddableMyInfoEmbeddable因为它没有 实施ArrayAccess .

因此,此解决方案也不起作用。

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

遵循哪个是正确的程序?

而不是在你的主窗体中:

$builder->add('myInfo', new MyInfoType(), 
['data_class' => 'AppBundleEntityEmbeddableMyInfoEmbeddable'])

您可以在MyInfoType表单中添加此表单(我相信,该表单与可嵌入实体相关联):

public function configureOptions(OptionsResolver $resolver)
{
   $resolver->setDefaults([
      'data_class' => 'AppBundleEntityEmbeddableMyInfoEmbeddable',
   ]);
}

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

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

经过一些不同keywords的其他搜索,我在SO上提出了这个答案,帮助我解决了问题。

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

解决方案是将data_class参数传递给FormBuilderadd()方法:

...
$builder
    ->add('myInfo', new MyInfoType(), ['data_class' => 'AppBundleEntityEmbeddableMyInfoEmbeddable'])
...

相关内容

  • 没有找到相关文章

最新更新