/** * Sync permissions với actions được 'định nghĩa' trong các resources model * * @return \Illuminate\Http\JsonResponse */ public function sync() { // actions định nghĩa trong các model $resource_actions = app('access-control')->getResourceActions(); $model_actions = []; foreach ($resource_actions as $resource => $actions) { $model_actions = array_merge($model_actions, array_map(function ($action) use($resource) { return "{$resource}.{$action}"; }, array_keys($actions))); } // actions đã lưu trên DB (permissions table) $db_actions = array_map(function ($permission) { return "{$permission['resource']}.{$permission['action']}"; }, Permission::all()->toArray()); // có trong DB, nhưng không có trong model ===> remove $remove = array_diff($db_actions, $model_actions); foreach ($remove as $action) { list($resource, $action_name) = explode('.', $action); if ($permission = Permission::whereResource($resource)->whereAction($action_name)->first()) { // Permission model sẽ tự động xóa liên kết với roles $permission->delete(); } } // có định nghĩa trong model, nhưng chưa lưu trong DB ===> insert $insert = array_diff($model_actions, $db_actions); if ($insert) { $permissions = array_map(function ($action) { list($resource, $action_name) = explode('.', $action); return ['resource' => $resource, 'action' => $action_name]; }, $insert); Permission::insert($permissions); } return response()->json(['type' => 'success', 'content' => trans('access-control::permission.sync_success')]); }
/** * @param \Minhbang\AccessControl\Models\Role $role * @param string $ids * * @return \Illuminate\Http\JsonResponse */ public function attachPermission(Role $role, $ids) { if ($ids = explode(',', trim($ids))) { $all_ids = Permission::all()->pluck('id')->all(); // Chỉ lấy ids là permissions ID $ids = array_filter($ids, function ($id) use($all_ids) { return in_array($id, $all_ids); }); // Loại bỏ các permissions đã attach vào $role này rồi $ids = array_diff($ids, $role->permissions->pluck('id')->all()); if ($ids) { $role->permissions()->attach($ids); } } return response()->json(['type' => 'success', 'content' => trans('access-control::role.attach_permission_success')]); }