我有一个具有字段角色的实体用户:
/**
* @ORMColumn(name="roles", type="json")
*/
private $roles = [];
public function getRoles(): array
{
return $roles = $this->roles;
}
public function setRoles($roles): self
{
$this->roles[] = $roles;
return $this;
}
我想添加功能来更新用户角色从ROLE_ADMIN到ROLE_USER。我在我的控制器中尝试了这个,但不是用ROLE_USER替换ROLE_ADMIN,而是插入了这个:ROLE_ADMIN" ROLE_USER"。这是我的控制器:
public function updateuser(Request $request, $id) {
$entityManager = $this->getDoctrine()->getManager();
$usr = $this->getDoctrine()->getRepository(User::class)->find($id);
$usr->setRoles("ROLE_USER");
$entityManager->persist($usr);
$entityManager->flush();
-
首先,它的最佳实践是每个用户至少有一个默认角色,如
ROLE_USER
。如果你想给用户额外的角色,你可以在ROLE_USER
旁边添加它们,比如ROLE_ADMIN
。 -
现在仔细看看数组在PHP中是如何工作的。让我们以你的setter函数
setRoles
为例。
当您编写像$this->roles[] = $roles
这样的值赋值时,则将值添加到数组。这就是为什么在你的代码中你有两个角色在你的数组中。已经存在的ROLE_ADMIN
和函数调用后添加的ROLE_USER
。
当你像$this->roles = $roles
这样写赋值时,整个数组将被新值覆盖.
结论:
如果你想要一个简单的解决方案,你的代码应该是这样的:
public function setRoles(array $roles): self
{
$this->roles = $roles;
return $this;
}
那么你可以这样调用它:
$user->setRoles(['ROLE_USER']);
setRoles
函数只接受数组。
$usr->setRoles(["ROLE_USER"]);
此外,如果您想将其存储为json,您可以使用json_encode
:
$usr->setRoles(json_encode(["ROLE_USER"]));