EasyAdmin 3.5.9中ChoiceField编辑用户角色后回显异常问题咨询
问题根因
这不是EasyAdmin的bug,核心原因是User实体的getRoles()方法逻辑与EasyAdmin字段渲染逻辑冲突:
EasyAdmin渲染编辑页的ChoiceField时,会自动调用对应属性的getter方法获取当前值。你当前的getRoles()实现会固定给返回值追加ROLE_USER、ROLE_AGENCY、ROLE_ADMIN三个角色,所以不管数据库里存储的角色是什么,getRoles()永远返回包含全部三个角色的数组,前端自然会把所有选项都标记为选中状态。
而提交表单时EasyAdmin会调用setRoles()存储提交的角色数组,所以数据入库是正常的。
解决方案
你可以根据业务需求二选一:
方案1:修正getRoles()方法(更推荐)
正常情况下Symfony的UserInterface要求getRoles()仅需保证所有用户至少拥有ROLE_USER即可,无需追加其余角色,修改后即可恢复正常:
/** * @see UserInterface */ public function getRoles(): array { $roles = $this->roles; // 仅追加基础角色ROLE_USER符合Symfony安全组件规范 $roles[] = 'ROLE_USER'; return array_unique($roles); }
方案2:为ChoiceField指定自定义取值逻辑
如果你的业务确实要求getRoles()必须返回全部三个角色,可以在UserCrudController中给角色字段设置自定义取值器,直接读取数据库存储的原始角色数据,绕过getRoles()的追加逻辑:
ChoiceField::new('roles') ->setChoices($roles) ->allowMultipleChoices() ->setValueGetter(function (User $user) { $reflection = new \ReflectionClass($user); $roleProp = $reflection->getProperty('roles'); $roleProp->setAccessible(true); return $roleProp->getValue($user); }),
内容的提问来源于stack exchange,提问作者ArbreMojo
相关产品推荐
相关产品推荐

