Yii2 如何在Kartik GridView中展示RBAC角色并实现按角色筛选
Yii2 Kartik GridView 新增RBAC角色列(支持筛选)实现指引
核心实现逻辑
Yii2默认RBAC不会把角色字段直接存在users用户表里,角色和用户的映射关系存储在auth_assignment表中,因此需要先打通搜索模型的关联查询,再通过Kartik的EnumColumn完成展示和筛选能力。
分步操作
1. 调整搜索模型,打通角色关联查询
当前给GridView传入的$searchModel对应的类(一般为common\models\UserSearch这类路径),需要做3处调整:
- 给模型新增虚拟属性
user_role,用来临时接收列表页的角色筛选输入值 - 在模型的
rules()方法中给user_role加上安全标记,允许被批量赋值:public function rules() { return ArrayHelper::merge(parent::rules(), [ // 原有isDisabled、email等字段的规则保持不变 [['user_role'], 'safe'], ]); } - 在模型的
search()方法中修改查询逻辑:- 给用户查询对象加上RBAC角色表的联表关联,取出每个用户对应的角色值
- 加上角色值的过滤逻辑,当用户在列表页输入/选择角色筛选值时,对应匹配
auth_assignment表中的角色名
public function search($params) { // 基础用户查询保持不变 $query = User::find(); // 联表关联RBAC角色分配表,取出对应用户的角色 $query->joinWith('rbacAssignment as rbacAssignment'); $dataProvider = new ActiveDataProvider([ 'query' => $query, ]); $this->load($params); if (!$this->validate()) { return $dataProvider; } // 原有email、name、isDisabled等字段的过滤逻辑保持不变 // 新增角色过滤逻辑 if (!empty($this->user_role)) { $query->andFilterWhere([ 'rbacAssignment.item_name' => $this->user_role ]); } return $dataProvider; } - 配套需要在
User主模型里定义rbacAssignment关联,关联条件为User.id = AuthAssignment.user_id即可。
2. 在GridView列配置中新增EnumColumn类型的角色列
把下面的列配置直接追加到原$gridColumns数组中,位置放在isDisabled对应的BooleanColumn后面、ActionColumn前面即可,完全匹配要求优先使用kartik\grid\EnumColumn的需求:
[ 'class' => 'kartik\grid\EnumColumn', 'label' => '用户角色', 'attribute' => 'user_role', // 枚举映射:key是数据库存的真实角色标识,value是页面展示的文本 'enum' => [ 'admin' => '系统管理员', 'manager' => '业务经理' ], // 从联表结果中取用户的实际角色值渲染 'value' => function ($model) { // 适配单用户单角色的场景 return $model->rbacAssignment?->item_name; }, // 筛选下拉选项,自带“全部”选项 'filter' => [ '' => '全部角色', 'admin' => '系统管理员', 'manager' => '业务经理' ], ]
- 因为仅需支持admin、manager两个角色,EnumColumn会自动处理列的展示文本、筛选下拉的选中态回显,不需要额外写自定义渲染或者筛选逻辑。
- 若后续扩展为单用户多角色,仅需修改
value回调,拼接返回所有关联的角色名即可,当前两角色的简单场景不需要额外适配。
3. 原有Grid配置无需额外修改
之前配置的pjax异步加载、边框样式、面板标题、响应式特性等都可以直接复用,新增列加载完成后自动生效,不需要调整原有的Widget配置。
内容的提问来源于stack exchange,提问作者Marco Cesana
相关产品推荐
相关产品推荐

