从zend框架3中的select form元素获取Doctrine \ Collection

时间:2017-02-14 22:34:46

标签: php zend-framework doctrine-orm

我试图在我的模块中实施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",得到"字符串"代替。

1 个答案:

答案 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,
        ],
    ]);