Laravel中基于Laratrust角色系统,如何按权限正确勾选复选框?
如何在Laravel Laratrust中根据角色权限状态勾选复选框?
嘿,我来帮你搞定这个复选框状态的问题!其实利用Laratrust自带的方法就能轻松实现,不用手动拼数组判断,下面一步步来:
第一步:优化控制器代码,预加载权限
首先我们可以优化你的AclController的index方法,利用Laratrust的关联预加载,同时避免手动拼装权限名称数组:
public function index() { // 预加载每个角色的权限,避免N+1数据库查询 $roles = Role::with('permissions')->get(); $permissions = Permission::all(); return view('pages.acl.index', compact('roles', 'permissions')); }
这里用with('permissions')提前把每个角色的权限数据加载好,不仅性能更好,在视图里也能直接调用权限相关的方法。
第二步:在视图中判断权限状态,设置复选框的checked属性
接下来在你的pages/acl/index.blade.php视图文件里,循环角色和权限,用Laratrust提供的hasPermissionTo()方法来判断当前角色是否拥有该权限,从而决定是否勾选复选框:
@foreach($roles as $role) <div class="mb-4"> <h4 class="font-bold">{{ $role->name }}</h4> <div class="grid grid-cols-2 md:grid-cols-4 gap-2 mt-2"> @foreach($permissions as $permission) <div class="flex items-center"> <input type="checkbox" id="perm-{{ $role->id }}-{{ $permission->id }}" name="roles[{{ $role->id }}][permissions][]" value="{{ $permission->name }}" {{ $role->hasPermissionTo($permission->name) ? 'checked' : '' }} > <label for="perm-{{ $role->id }}-{{ $permission->id }}" class="ml-2"> {{ $permission->name }} </label> </div> @endforeach </div> </div> @endforeach
补充说明:
hasPermissionTo()是Laratrust为Role模型提供的内置方法,直接传入权限名称就能返回布尔值,判断角色是否拥有该权限,非常方便。- 如果你习惯用权限ID来判断,也可以换成
$role->permissions->contains('id', $permission->id),效果是一样的。 - 如果这个表单是用来提交权限更新的,后端可以用
$role->syncPermissions($requestedPermissions)来同步角色的权限,自动完成新增和删除操作。
内容的提问来源于stack exchange,提问作者Камилов Тимур
相关产品推荐
相关产品推荐

