我试图在我的模块中实施https://github.com/ZF-Commons/zfc-rbac。目前我被困住了,因为我得到了以下异常:
传递给User \ Entity \ User :: setRoles()的参数1必须实现接口Doctrine \ Common \ Collections \ Collection,给定数组......
Line,导致UserManager类中的错误:$user->setRoles($data['role']);
很清楚,实体中的setter是错误的,或者是select类型的元素,它返回$data['role']
元素。
二传手的代码:
public function setRoles(Collection $roles)
{
$this->roles->clear();
foreach ($roles as $role) {
$this->roles[] = $role;
}
}
UserForm中的select元素代码:
$this->add([
'type' => 'DoctrineModule\Form\Element\ObjectSelect',
'name' => 'role',
'attributes' => [
'multiple' => true,
],
'options' => [
'object_manager' => $this->entityManager,
'target_class' => 'User\Entity\Role',
'label' => 'Role',
'value_options' => $roles,
'disable_inarray_validator' => true, //TODO: create validator
'required' => true,
],
]);
那么我如何让select元素返回Doctrine \ Common \ Collections \ Collection?
我尝试使用Doctrine命名空间中的ArrayCollection,但它没有用。我是否必须创建单独的类,它实现Collection接口并将其与select元素一起使用?或者也许有一些更方便的方法来实现这个目标?
我还尝试在实体中删除了@ var,@ param注释和类型,但在这种情况下,我收到了以下消息:
类型" Doctrine \ Common \ Collections \ Collection | array"的预期值对于关联字段"用户\实体\用户#$ roles",得到"字符串"代替。
答案 0 :(得分:0)
我找到了解决问题的方法。用户实体中的setter是正确的我只需要制作小帮助函数,即将数组从select输入转换为Role对象数组:
private function getRolesFromArray($array){
$roles = $this->entityManager->getRepository(Role::class)
->findBy(['id'=> $array]);
return new ArrayCollection($roles);
}
所以ArrayCollection有效! 在Form对象中也有正确的选择字段:
$this->add([
'type' => 'DoctrineModule\Form\Element\ObjectSelect',
'name' => 'role',
'attributes' => [
'multiple' => true,
],
'options' => [
'object_manager' => $this->entityManager,
'target_class' => 'User\Entity\Role',
'label' => 'Role',
'required' => true,
],
]);