使用表单实体类型编辑时的 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
我有两个实体,即 User
和 Role
,它们之间存在多对多关系。我生成了一个 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,));
}
我有两个实体,即 User
和 Role
,它们之间存在多对多关系。我生成了一个 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,));
}