json - 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();
解决方案
首先,它的最佳实践是每个用户至少有一个默认角色,例如
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']);
推荐阅读
- php - UPDATE 语句在执行时不起作用
- python - 如何在 python 中正确存储“用户制作”的对象?
- php - 带有 COUNT 和 ORDER BY 以及隐藏结果的 MySQL 查询
- java - Java Jxl 读/写到工作簿
- vue.js - 使用 v-for 和 v-model 预选数组的第一个选项
- python-3.x - 如何正确使用嵌套循环
- kotlin - 如何修复未解决的参考:setupWithViewPager
- android - firebasetool的recyclerview聊天UI
- swift - 类型“DBTweet”不符合协议“可解码”
- php - 有没有办法在表单本身上显示错误但表单操作重定向到另一个 php 文件?