我有一个使用教义embeddable
的教义Entity
。
我想创建一个表单来编辑Entity
和Embeddable
。
我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
参数传递给FormBuilder
的add()
方法:
...
$builder
->add('myInfo', new MyInfoType(), ['data_class' => 'AppBundleEntityEmbeddableMyInfoEmbeddable'])
...