Laravel 5.1 acl角色和前端

时间:2016-05-17 14:44:54

标签: php mysql laravel eloquent laravel-5.1

这是我的权限,角色和permission_role

的表结构

权限:

ID 名称

作用:

ID 名称

permission_role:

ROLE_ID, permission_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();
 }

role.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";

});

2 个答案:

答案 0 :(得分:1)

你添加了

use App\Role;

在controller.php文件中?

答案 1 :(得分:1)

它不起作用的原因是因为您尚未根据从视图传回的Role创建Permissionid对象。下面给出一个工作实例:

$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添加到Controller文件的顶部。

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

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