使用表单实体类型编辑时的 Symfony "spl_object_hash() expects parameter 1 to be object, string given"

Symfony "spl_object_hash() expects parameter 1 to be object, string given" when editing with form entity type

我有两个实体,即 UserRole,它们之间存在多对多关系。我生成了一个 CRUD,它运行良好,但 UserType 表单呈现了一个 select 菜单,用于为用户选择角色。因为我需要下拉菜单中的复选框,所以我对 UserType class

进行了以下更改

初始

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('firstName')
            ->add('lastName')
            ->add('address')
            ->add('phone')
            ->add('nic')
            ->add('email')
            ->add('password')
            ->add('isActive')
            ->add('roles');
    }

修改后

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('firstName')
            ->add('lastName')
            ->add('address')
            ->add('phone')
            ->add('nic')
            ->add('email')
            ->add('password')
            ->add('isActive')
            ->add('roles',EntityType::class, array('class'=>'AppBundle\Entity\Role',
                'multiple'=>true,
                'expanded'=>true,));
    }

这就是一切的开始。我可以毫无问题地创建一个新用户,但是当我尝试编辑

Warning: spl_object_hash() expects parameter 1 to be object, string given

未呈现编辑表单时出现错误。

我尝试解决问题

用户实体用于登录我的系统,因此我return一组角色属于用户。

    public function getRoles()
        {
            $role_data = $this->roles->toArray();
            $roles = array();

            foreach($role_data as $key=>$role)
            {
                $roles[] = $role->getName();
            }

            return $roles;
        }

我把上面的getter改成了简单的return一个对象如下

    public function getRoles()
    {
        return $this->roles;
    } 

现在用户创建和编辑工作正常,但我的登录被破坏,因为 getRoles 不再 return 数组

我真正想要的是呈现带有 selecting 角色复选框的 UserType 表单,但是当我尝试这样做时发生了这种情况。到目前为止,我试图找到一个没有任何成功的解决方案。

表单实体类型需要对象列表(角色实体)作为它的值,但获取字符串列表作为 getRoles 方法 returns 字符串列表。您不能更改 getRoles 方法,因为它是安全组件的一部分。您可以将 roles 字段重命名为其他名称,并有 2 个方法 getXXX 获取角色实体列表和 getRoles 安全组件。

例如:

用户

class User
{
    /**
     * @ORM...
     * ...
     */
    $sroles

    function getSroles()
    {
        return $this->sroles;
    }

    public function getRoles()
    {
        $role_data = $this->sroles->toArray();
        $roles = array();

        foreach($role_data as $key=>$role)
        {
            $roles[] = $role->getName();
        }

        return $roles;
    }
}

表格

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('firstName')
            ->add('lastName')
            ->add('address')
            ->add('phone')
            ->add('nic')
            ->add('email')
            ->add('password')
            ->add('isActive')
            ->add('sroles',EntityType::class, array('class'=>'AppBundle\Entity\Role',
                'multiple'=>true,
                'expanded'=>true,));
    }