我是Symfony2的新手,现在我对一组表单有疑问 . 我有两个实体 . 实体用户和实体角色 .
实体用户
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(type="string", length=25, unique=true)
*/
private $username;
/**
* @ORM\Column(type="string", length=32)
*/
private $salt;
/**
* @ORM\Column(type="string", length=250)
*/
private $password;
/**
* @ORM\Column(type="string", length=60, unique=true)
*/
private $email;
/**
* @ORM\Column(name="is_active", type="boolean")
*/
private $isActive;
/**
* @ORM\ManyToMany(targetEntity="Role", inversedBy="users")
*
*/
private $roles;
实体角色
/**
* @ORM\Column(name="id", type="integer")
* @ORM\Id()
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(name="name", type="string", length=30)
*/
private $name;
/**
* @ORM\Column(name="role", type="string", length=20, unique=true)
*/
private $role;
/**
* @ORM\ManyToMany(targetEntity="User", mappedBy="roles")
* @ORM\JoinTable(name="user_role",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")}
* )
*/
private $users;
public function __construct()
{
$this->users = new ArrayCollection();
}
调节器
public function editUserAction($id, Request $request)
{
$em = $this->getDoctrine()->getManager();
$user = $em->getRepository('PsoLogBundle:User')->find($id);
$form = $this->createForm(new NewUserType(),$user);
$form->handleRequest($request);
if (!$user) {
throw $this->createNotFoundException(
'No news found for id ' . $id
);
}
if ($form->isValid()) {
$em->flush();
$this->get('session')->getFlashBag()->add('notice', 'User updated successfully');
}
$build['form'] = $form->createView();
return $this->render('PsoLogBundle:Security:editUser.html.twig', $build);
}
现在,我有一个包含用户和角色的表单集合,这些表单保存在用户的数据库中 . 当我对角色进行更改时,我收到错误“执行时发生异常'UPDATE pso_role SET role =?WHERE id =?'用params [“ROLE_ADMIN”,2]“
问题是Symfony想要在实体角色的表上进行更改 . 实际上,它应该是表中关于User - Role关系的新条目 . 我在谷歌和这里搜索stackoverflow,但我找不到我要改变的东西 .
我认为问题可能是formbuilder
$builder ->add('username','text', array('label' => 'Username'))
->add('email','email', array('label' => 'Email'))
->add('isActive','text', array('label' => 'User aktiv'))
->add('Roles', 'collection', array('type' => new RoleType()))
->add('Submit', 'submit', array( 'attr'=> array ( 'formnovalidate' => 'formnovalidate' )));
可能是,行add('Roles','collection',array('type'=> new RoleType()))定义了应该更新的实体?我能改变吗?
如果我不使用它与表单集合,但只使用单个表单,一切正常,因为那时只有一个实体受到影响 . 如果有人能给我一个提示,我会很高兴的 .
现在我在Formbuilder中尝试了 - > add('roles','entity',array('class'=>'PsoLogBundle:Role','property'=>'role'))
然后我得到错误“既没有属性”角色“也没有方法之一”setRoles()“,”__ set()“或”__call()“存在并且在类”Pso \ LogBundle \ Entity \ User“中具有公共访问权限 . “
我试图在实体用户中插入setter
public function setRoles( ArrayCollection $roles)
{
$this->roles = $roles;
return $this;
}
然后我得到错误ContextErrorException:Catchable Fatal Error:传递给Pso \ LogBundle \ Entity \ User :: setRoles()的参数1必须是Pso \ LogBundle \ Entity \ ArrayCollection的实例,给出Pso \ LogBundle \ Entity \ Role的实例,在第347行的C:\ xampp \ htdocs \ pso \ vendor \ symfony \ symfony \ src \ Symfony \ Component \ PropertyAccess \ PropertyAccessor.php中调用,并在C:\ xampp \ htdocs \ pso \ src \ Pso \ LogBundle \中定义Entity \ User.php第99行
我试着解决这个问题
'multiple' => false,
就像我在here中找到的一样
但这并没有改变这种情况 .
我在user.php中添加了一个角色的setter
// Important
public function setRoles($roles)
{
foreach($roles as $p)
{
$po = new user_role();
$po->setUser($this);
$po->setRoles($p);
$this->addPo($po);
}
}
当我这样做并生成新的setter和getter时,我没有错误,当我更改用户的角色时,但在DB中,条目不会更改 .
经过几个小时的搜索,我现在就开始工作了 . 之前的二传手是对的 . 另外我改变了formbuilder
->add('roles', 'entity', array('class' => 'PsoLogBundle:Role','property' => 'role','multiple' => true,))
现在,当我提交表单时,角色会正确更改 . 感谢evereybody回答,以便我找到正确的方向 . 我希望,现在一切正常 .
问候米哈
1 回答
您应该在您的用户实体中:
在您的角色实体中:
在你的角色构造函数中:
而不是集合,它将多选: