Symfony 4 - 更新 JSON 用户角色

Symfony 4 - update JSON user roles

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

/**
 * @ORM\Column(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();

setRoles函数只接受数组。

因此您的代码应相应更改:

$usr->setRoles(["ROLE_USER"]);

另外,如果要存储为json,可以使用json_encode:

$usr->setRoles(json_encode(["ROLE_USER"]));
  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']);