我正在尝试使用FosUserBundle向我的注册表单添加字段。
将常规字段添加到用户类,例如“name”,“age”,这很容易做到:
class RegistrationFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
// add your custom field
$builder
->add('name')
;
}
public function getParent()
{
return 'fos_user_registration';
}
public function getName()
{
return 'acme_user_registration';
}
}
这一切正常,新字段将写入我的数据库表。
但是我如何在Fos Bundle的注册类型中添加一个新的FormType,如: 用户可以拥有与OneToMany相关的地址。
我尝试了以下内容,首先创建地址类并给他一个用户:
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="addresses")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
protected $user;
然后通过向User类添加地址:
/**
* @ORM\OneToMany(targetEntity="Address", mappedBy="user")
*/
protected $addresses;
public function __construct()
{
parent::__construct();
// your own logic
$this->addresses= new ArrayCollection();
}
添加AddressType:
class AddressType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('state', 'text')
->add('city','text')
->add('zipcode', 'text')
->add('street', 'text');
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Acme\UserBundle\Entity\Address',
));
}
public function getName()
{
return 'address';
}
}
到RegistrationFormType工作,字段显示在浏览器中:
public function buildForm(FormBuilderInterface $builder, array $options)
{
// add your custom field
$builder
->add('name')
->add('addresses', new AddressType())
;
}
但是当我尝试使用新数据提交表单时,我不知道如何说symfony输入的地址应该与用户相关。 我总是得到错误:
“表单的视图数据应该是Acme \ UserBundle \ Entity \ Address类的实例,但是是Doctrine \ Common \ Collections \ ArrayCollection类的实例。您可以通过设置”data_class“选项来避免此错误null或添加一个视图转换器,将类Doctrine \ Common \ Collections \ ArrayCollection的实例转换为Acme \ UserBundle \ Entity \ Address的实例。“
我在这里做错了什么?
问候。
答案 0 :(得分:2)
当您提供" data_class"时,您尝试将集合添加为单个字段。你说#34;这里是这个实体的形式",但是由于错误说系统必须管理每个与单个实体相关的表单集合,你需要对它们进行数据转换他可以用简单(或预建)的方式管理(寻找DataTransformers)
或者您可以使用colletion字段类型并将其传递给地址表单类型
- 在评论后编辑 -
不,抱歉我错过了,你需要一个实体表单类型,因为你声明用户有一个地址(许多用户可以映射到同一个地址,即一个家庭),所以&#39 ;不需要集合,尽管你在拥有这个用户方面坚持让用户不必担心,如果你说你的映射模式中的级联持续存在于ManyToOne关系中,Doctrine会存储地址为你(或在匹配的情况下使用现有的)
顺便说一句,我被你的句子弄糊涂了#34;用户可以拥有一个与OneToMany相关的地址。"这种误导性,用户可以拥有一个与ManyToOne关系相关的地址(许多用户可以拥有一个地址),该地址与用户处于一种关系(许多用户拥有该地址)