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:直接通过可嵌入对象
这是myMyEntityType
类的代码:
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())