在Vue JS和Laravel 5.1 + Entrust中检查特定角色的权限

5
我正在使用 Laravel 5.1 中的 Zizaco/entrust。我想通过复选框显式地为特定角色授予权限。这是我的代码:

获取角色:

fetchRoles: function(){
        this.$http.get('api/role',function(data){
            this.$set('roles',data);
        });
    }

获取权限中:

fetchPermissions: function(){
            this.$http.get('api/permission',function(data){
                this.$set('permissions',data);
            });
        }

以下是分配角色和权限的表格:
<table class="table table-bordered table-responsive">
    <thead>                                                        
       <th>Permissions/Roles</th>
       <th v-for="role in roles">
           @{{ role.display_name }}
       </th>
    </thead>
    <tbody>
       <tr v-for="permission in permissions">
           <td>@{{ permission.display_name }}</td>
           <td v-for="role in roles">
               <input type="checkbox" value="@{{ permission.id }}" name="roles[@{{ role.id }}][permissions][]">
           </td>
       </tr>
    </tbody>
    <tfoot>
       <tr>
          <td>
              <button type="submit" class="btn btn-primary">Alter Permission</button>
          </td>
       </tr>
    </tfoot>
</table>

输出结果如下: 输出屏幕截图 权限也可以通过以下方法成功分配:
public function changePermission(Request $request){
        $input = $request->all();
        $roles = Role::all();

        foreach($roles as $role)
        {
            $permissions_sync = isset($input['roles'][$role->id])? $input['roles'][$role->id]['permissions'] : [];
            $role->perms()->sync($permissions_sync);
        }
        Flash::success('Successfully modified permissions!');
        return redirect()->back();
    }

我唯一遇到的问题是如果角色具有特定权限,如何使选中的复选框被选中。

如果是在PHP对象中,我可以这样做:

   @if(count($permissions)>0)
     @foreach($permissions as $permission)
     <tr>
     <td>{{$permission->display_name}}</td>
         @if(count($roles)>0)                                                          
            @foreach($roles as $role)
            <td><input type="checkbox" value="{{$permission->id}}" name="roles[{{$role->id}}][permissions][]" @if($role->hasPermission($permission->name)) checked="checked" @endif></td>@endforeach @endif </tr> @endforeach @endif

如何在Vue JS中使用hasPermission()方法?


你是在使用组件还是单个的Vue实例? - Justin MacArthur
嘿,Justin,这是在单个Vue实例内部。 - sazanrjb
1个回答

1

我曾经遇到同样的问题,经过一段时间的寻找答案后,我决定不再去寻找其他答案,而是直接查看VueJS文档,具体来说是有关复选框的部分

因此,似乎Vue将每个复选框的值存储在“checkedNames”数组中,并将其绑定到所有复选框。由于我们有多个权限和与这些权限分配的角色,因此我们可以实现相同的效果。

以下是我所做的基本示例。

在我的模板中,我有一个角色和权限的拆分视图:

<div class="roles">
   <div v-for="role in roles">
      <a v-on:click="update(role)">{{ role.name }}</a>
   </div>
</div>

<div class="perms">
   <div v-for="perm in permissions">
      <input type="checkbox" 
          v-model="currentPerms" 
          v-bind:id="perm.id" 
          v-bind:value="perm.name"> {{perm.display_name}} {{perm.name}}
   </div>
</div>

由于复选框与“currentPerms”数组绑定,因此我们可以通过选中复选框或设置值来更新该数组,因为它是响应式的。

在这种情况下,我使用lodash来映射所点击角色的值。

<script>
...

update: function(role) {
   this.currentPerms = _.map(role.perms, permission => {
       return permission.name;
   });
}

...
</script>

我已经制作了一个JSFiddle示例。希望这可以帮到你!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接