【问题标题】:Laravel 5.1 acl roles and permission in frontendLaravel 5.1 acl 角色和前端权限
【发布时间】:2016-09-13 17:51:33
【问题描述】:

这是我的权限、角色和权限角色的表结构

权限:

身份证 名字

角色:

身份证 名字

permission_role:

role_id, 权限ID

这里的 permission_role 是我的数据透视表。

在我设置了类似这样的前端,

welcome.blade.php

  <form method="POST" action="/give/permission">
    {!! csrf_field() !!}

      <select name="role" class="selectpicker" multiple data-max-options="2">
      @foreach($roles as $r)
      <option value="{{$r->id}}">{{$r->name}}</option>
      @endforeach
</select>
<div class="checkbox">
@foreach ($perm as $p)
    {!! Form::checkbox('p[]', $p->id, in_array($p->id, $all_data)) !!}
    {!! Form::label('permisssion', $p->name) !!}<br>
@endforeach
    </div>
    <button type="submit" class="default">Submit</button>
    </form>

在我的controller.php中

public function postrolperm(Request $request,$id){
    $p = Role::find($id);
    $role = $request->role;
    //dd($input1);
    $permission = $request->p;
  //dd($input2);
  //
  //$role = Role::where("name", "admin")->get();

  if(isset($permission) && isset($role)){
    $role->givePermissionTo($permission);
    $role->save();
  }
  return redirect::back();
 }

角色.php

public function givePermissionTo(Permission $permission)
    {
        return $this->permissions()->save($permission);
    }

我无法将数据保存到数据透视表中。

我在php artisan tinker 中尝试过使用以下命令:

 $role = Role::first(); //which gives me the first role with id of 1

    $role->givePermissionTo(Permission::first()); // it will save the first permission to the role.

我的控制器做错了什么?

还要注意,这条路线可以正常工作。

Route::get("/pivot", function(){
    $permission = new Permission;
    $permission->name = "can to";
    $permission->save();
    $role = new Role;
    $role->name = "admin2";
    $role->save();
    $role->givePermissionTo($permission);
    return "true";

});

【问题讨论】:

  • 做一个模具转储,例如dd(I am set) 在控制器函数内的 if 内,以确保从请求中设置角色和权限。
  • Yes..role 和权限在 die dump 后设置。
  • 在$role-&gt;givePermissionTo($permission); 之后致电$role-&gt;save();。这行得通吗?
  • 我也收到此错误:调用非对象上的成员函数 givePermissionTo()
  • 不行@MuyiwaOlu-Ogunleye

标签: php mysql laravel eloquent laravel-5.1


【解决方案1】:

你添加了吗

use App\Role;

在controller.php 文件中?

【讨论】:

  • 将参数“Request $request”传递给posttrolperm函数并添加“use Illuminate\Http\Request;”到同一个控制器文件。
【解决方案2】:

它不起作用的原因是因为您没有根据从视图传回的ids 创建Role 和Permission 对象。下面给出了一个工作示例:

$role_id = $request->role;
$permission_ids = $request->p; // This comes back as an array.
if(isset($permission_ids) && isset($role_id)){
    $role_object = Role::where('id', $role_id)->firstOrFail();
    foreach ($permission_ids as $permission_id) {
        // loop through each permission id
        // find the corresponding permission object in the database
        $permission_object = Permission::where('id', $permission_id)->firstOrFail();

        // assign the object to the role
        $role_object->givePermissionTo($permission_object);
    }
    $role_object->save();
}
return Redirect::back()

请注意,如果从视图传回的角色和权限与数据库中的有效 id 不对应,这将引发异常。如果您希望故障保持沉默,即不引发异常,请使用first() 而不是 firstOrFail()。

确保将use App\Role; 和use App\Permission 添加到控制器文件的顶部。

您的版本失败,因为您尝试在表示从视图传递的角色 ID 的字符串上调用 givePermissionTo 函数 - $role。您错过了从数据库中获取 Role 对象之间的步骤。

奇怪的是,您的 $p 变量在正确的轨道上,但是您还需要从数据库中获取相应的 $permission 对象,如我的示例所示。

【讨论】:

  • 但是现在当我为单个角色选择多个权限时,我会收到类似“没有模型 [App\Permission] 的查询结果”的错误。我尝试在 if 语句中执行 print_r($permission_id) 和 is_array($permission) 。但无法在数据库中插入。
  • 我看到了这个问题,我会在我回到我的电脑时修改它。
  • 已更新,如果这能解决您的问题,请告诉我。 @冷
  • 是的,这解决了这个问题,谢谢。但是我遇到了一个问题,我需要在复选框中获取所有角色的权限。就像我为所有角色做了@foreach,然后是$roles->permissions()。我有 belongsToMany 关系。我怎样才能在刀片中实现这一点。有什么选择吗?
  • 最好再问一个问题。如果这解决了原始问题,请将其标记为已回答。问另一个问题(与刀片有关)并将链接发送给我,我很乐意看看。
猜你喜欢
  • 2016-08-24
  • 2017-09-13
  • 2014-09-15
  • 2019-08-06
  • 2019-04-27
  • 2019-07-31
  • 1970-01-01
  • 2022-01-01
  • 2021-02-02
相关资源
最近更新 更多