Symfony2具有多对多关系的表单实体字段
我有一个与角色实体有多对多关系的用户实体。我还有一个表单,它根据用户实体字段在表单中显示用户详细信息。我使用FormBuilder在控制器中以正常方式设置表单,并传入从数据库加载的实体实例。这一切都很好 现在,我想要的是此表单中的一个选择菜单,其中包含分配给用户的角色,并从数据库中的可用角色填充。我在我的Symfony2具有多对多关系的表单实体字段,symfony,doctrine-orm,Symfony,Doctrine Orm,我有一个与角色实体有多对多关系的用户实体。我还有一个表单,它根据用户实体字段在表单中显示用户详细信息。我使用FormBuilder在控制器中以正常方式设置表单,并传入从数据库加载的实体实例。这一切都很好 现在,我想要的是此表单中的一个选择菜单,其中包含分配给用户的角色,并从数据库中的可用角色填充。我在我的UserType表单中创建了一个名为roles的字段,该字段的类型为“collection”,并传入了RoleType表单实例。在我的RoleType表单中,我添加了一个类型为entity的字段
UserType
表单中创建了一个名为roles
的字段,该字段的类型为“collection”,并传入了RoleType
表单实例。在我的RoleType
表单中,我添加了一个类型为entity
的字段,并定义了我的角色类等。这一切都是根据文档进行的。这一切都很好,它加载了填充了角色的选择菜单,但没有选择针对用户实体保存的正确角色
当我跟踪“角色”的表单值(或在我的角色实体字段上设置数据转换器)时,我得到的值是一个字符串,其中包含与用户关联的角色的名称。我没有得到角色实例或集合/数组。此外,如果我将角色实体字段设置为multiple=true
,我将从条令数据转换器中获得一个预期的条令\Common\Collections\Collection对象。
错误。同样,这是因为它需要一个集合并获得一个字符串
这可能与我的用户实体被水合的方式有关吗?我正在使用$repository->findOneBy(数组('id'=>$id))
这是我所做工作的简化版本:
用户类
class User implements AdvancedUserInterface, \Serializable
{
/**
* @ORM\ManyToMany(targetEntity="Role", inversedBy="users")
*/
public $roles;
public function __construct()
{
$this->roles = new ArrayCollection();
}
public function getRoles()
{
return $this->roles->toArray();
}
}
class Role implements RoleInterface
{
/**
* @ORM\ManyToMany(targetEntity="User", inversedBy="roles")
*/
public $users;
public function __construct()
{
$this->users = new ArrayCollection();
}
public function getUsers()
{
return $this->users;
}
}
角色类别
class User implements AdvancedUserInterface, \Serializable
{
/**
* @ORM\ManyToMany(targetEntity="Role", inversedBy="users")
*/
public $roles;
public function __construct()
{
$this->roles = new ArrayCollection();
}
public function getRoles()
{
return $this->roles->toArray();
}
}
class Role implements RoleInterface
{
/**
* @ORM\ManyToMany(targetEntity="User", inversedBy="roles")
*/
public $users;
public function __construct()
{
$this->users = new ArrayCollection();
}
public function getUsers()
{
return $this->users;
}
}
用户表单类型
class UserType extends AbstractType
{
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'NameSpace\MyBundle\Entity\User',
));
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('id', 'hidden')
->add('roles', 'collection', array('type' => new RoleType()))
->add('save', 'submit');
}
public function getName()
{
return 'user';
}
}
class RoleType extends AbstractType
{
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'NameSpace\MyBundle\Entity\Role',
));
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('name', 'entity', array(
'class' => 'NameSpace\MyBundle\Entity\Role',
'property' => 'name'
[multiple => true]
));
}
public function getName()
{
return 'role';
}
}
角色表单类型
class UserType extends AbstractType
{
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'NameSpace\MyBundle\Entity\User',
));
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('id', 'hidden')
->add('roles', 'collection', array('type' => new RoleType()))
->add('save', 'submit');
}
public function getName()
{
return 'user';
}
}
class RoleType extends AbstractType
{
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'NameSpace\MyBundle\Entity\Role',
));
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('name', 'entity', array(
'class' => 'NameSpace\MyBundle\Entity\Role',
'property' => 'name'
[multiple => true]
));
}
public function getName()
{
return 'role';
}
}
您没有从用户实体向表单提供角色集合:
public function getRoles()
{
//this returns an array
return $this->roles->toArray();
}
form类使用实体中的getter和setter,因此您实际上返回了一个数组,因为这是Symfony2安全系统所需要的。您还需要实现GetRoleCollection字段,并在表单中使用该字段:
public function getRolesCollection()
{
//this returns a collection
return $this->roles;
}
//and (updated from comment below)
->add('roles_collection', 'entity', array('type' => new RoleType()))
破产管理署平台的工作如下:
这篇博文也可能有帮助:
这是一个为FOSUserBundle在数据库中添加角色的家伙太好了,谢谢你。这是问题的一部分。另一部分是我需要将UserType表单中的“roles\u collection”字段类型设置为“entity”,而不是“collection”。这样就不需要“RoleType”表单类。这在您发布的第一个链接中有说明。是的,添加
getRolesCollection()
addrolecolection($role)
removeolecollection($role)
作为[get | add | remove]role()代理,效果很好,谢谢!您的双向多人游戏必须有一个mappedBy
,而不是两个inversedBy
。