首页 > 解决方案 > Symfony 4 - 更新 JSON 用户角色

问题描述

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

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

标签: jsonsymfonydoctrine-ormdoctrinesymfony4

解决方案


  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']);

推荐阅读