Symfony 4 -更新JSON用户角色



我有一个具有字段角色的实体用户:

/**
* @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();
  1. 首先,它的最佳实践是每个用户至少有一个默认角色,如ROLE_USER。如果你想给用户额外的角色,你可以在ROLE_USER旁边添加它们,比如ROLE_ADMIN

  2. 现在仔细看看数组在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"]));

最新更新