角色管理
先做路由,增删改查
// 角色
$router->get('/role/list', 'RoleController@lists'); // 角色列表
$router->addRoute(['GET', 'POST'],'/role/add', 'RoleController@add'); // 添加角色
$router->addRoute(['GET', 'POST'],'/role/edit/{id:[1-9]+}', 'RoleController@edit'); // 编辑角色
$router->post('/role/del', 'RoleController@del'); // 删除角色
在角色模型中,写个list()方法
在控制器中,写个lists()方法
在角色视图下新建一个list.blade.php文件,效果如下
添加角色
角色模型里添加add()方法
public function permissions()
{
return $this->belongsToMany(Permission::class, 'role_permissions', 'role_id', 'permission_id');
}
public static function add(array $roleData, array $permissionData)
{
try {
DB::transaction(function () use ($roleData, $permissionData) {
// 保存角色信息
$role = new Role();
$role->role_name = $roleData['role_name'];
$role->save();
$role->permissions()->attach(array_values($permissionData));
});
} catch (\Exception $e) {
Log::error('添加角色信息失败,失败信息:' . $e->getMessage());
return false;
}
return true;
}
首先使用多对多关联,因为角色和权限是多对多关系,我们使用belongsToMany()方法,第一个参数指定是权限表,第二个参数是关联关系的表名,你看,这个模型是role模型,要关联permission模型,一定要通过角色-权限模型即role_permission模型,第三个参数是role模型在关联模型中的外键,第四个参数permission模型在关联关系中的外键。
这里要使用事务,插入角色失败或者角色-权限关系失败都要数据回滚。插入角色-权限关系数据的时候,我这里使用了attach(),如果对这个不了解,可以看文档。如果插入报错,我这里也记录了错误信息。前边所讲所有的模型中,在增删改操作的时候,如果失败,都应该保存失败信息。
控制其中写一个add()方法
public function add(Request $request)
{
if ($request->post()) {
// todo 验证数据;验证角色名是否重复
Role::add($request->input(), $request->input('id'));
return $this->response->responseJSON();
}
$data['menus'] = Menu::lists(); // 根据菜单查找权限
return view('admin.role.add', $data);
}
我们插入一条信息看看
添加成功。
在看看编辑。在模型层写一个edit()方法。添加的时候,我们使用的是attach(),更新的时候我们使用sync(),为什么呢?这个区别比较大,attach就是纯粹的新增数据,sync就不一样了,sync 方法接收一个数组以替换中间表的记录。中间表记录中,所有未在数组中的记录都将会被移除。所以该操作结束后,只有给出数组的 ID 会被保留在中间表中。
public static function edit(Role $role, array $permissionData)
{
try {
$role->permissions()->sync(array_values($permissionData));
} catch (\Exception $e) {
Log::error('添加角色信息失败,失败信息:' . $e->getMessage());
return false;
}
return true;
}
在控制器中,写一个edit()方法
public function edit(int $id, Request $request)
{
$role = Role::with('permissions')->where('id', $id)->first();
// todo 如果数据不存在,跳转到错误页面
if ($request->post()) {
// todo 验证数据;验证角色名是否重复
Role::edit($role, $request->input('id'));
return $this->response->responseJSON();
}
// 获取该角色下的所有的权限ID,然后放到数组中,便于在视图中判断权限是不是被选中
$permission = [];
foreach ($role->permissions as $item) {
array_push($permission, $item->pivot->permission_id);
}
$data['menus'] = Menu::lists(); // 根据菜单查找权限
$data['role'] = $role;
$data['permission'] = $permission;
return view('admin.role.edit', $data);
}
视图我直接改好了,代码代码太多,我就不粘贴出来了,直接看效果。
看,是全部选中状态,我们改成一部分选中,一部分不选中,修改下看看
没有问题,你看看,使用laravel/lumen是不是减轻了很多工作?
最后是删除,在角色模型中,写一个del()方法
public static function del(Role $role)
{
$role->delete();
$role->permissions()->detach();
}
控制器中新增一个del方法
public function del(Request $request)
{
// todo 验证数据,必须是数组
try {
DB::transaction(function () use ($request) {
// 查询出所有要删除的角色。
$roles = Role::whereIn('id', $request->input('ids'))->get();
foreach ($roles as $role) {
// 删除角色
Role::del($role);
}
});
} catch (\Exception $e) {
Log::error("删除角色失败,{$e->getMessage()}");
$this->response->setMsg(500, '删除角色失败');
return $this->response->responseJSON();
}
return $this->response->responseJSON();
}
我们看看数据中的数据
然后我们删除
角色-权限数据全部删除
完。