public static function updateRoleUsers(AclRole $role) { $current_users = UserRole::where('role_id', '=', $role->role_id)->lists('user_id'); $users_to_delete = array_diff($current_users, $role->users->toArray()); if ($users_to_delete) { static::where('role_id', '=', $role->role_id)->whereIn('user_id', $users_to_delete)->delete(); $default_role_id = static::getDefaultRoleId(); if ($default_role_id) { $users_with_roles = static::whereIn('user_id', $users_to_delete)->get()->lists('user_id'); $user_without_roles = array_diff($users_to_delete, $users_with_roles); foreach ($user_without_roles as $user_id) { UserRole::create(['role_id' => $default_role_id, 'user_id' => $user_id]); } } } $users_to_add = array_diff($role->users->toArray(), $current_users); if ($users_to_add) { foreach ($users_to_add as $user_id) { UserRole::create(['role_id' => $role->role_id, 'user_id' => $user_id]); } } }
public function setRoles(array $roleIds) { DB::beginTransaction(); $new_roles = array_diff($roleIds, $this->roles); $exist_roles = array_intersect($roleIds, $this->roles); $deleted_roles = array_diff($this->roles, $roleIds); $new_role_saved = []; $roleProviders = AclFacade::getRoleProvidersTypes(); foreach ($roleProviders as $rp_type) { $rp = AclFacade::getRoleProvider($rp_type); if ($rp->allowUpdateRole()) { $roles_to_delete = $deleted_roles ? $rp->getRoles($deleted_roles)->lists('role_id') : []; if ($roles_to_delete) { UserRole::where('user_id', '=', $this->getKey())->whereIn('role_id', $roles_to_delete)->delete(); } $roles = $new_roles ? $rp->getRoles($new_roles) : []; foreach ($roles as $role) { $role_id = $role->role_id; UserRole::create(['user_id' => $this->user_id, 'role_id' => $role_id]); $new_role_saved[] = $role_id; } } } DB::commit(); $this->roles = array_merge($exist_roles, $new_role_saved); Event::fire('acl_role_updated', array($roleIds)); $cache_prefix = Config::get('acl::cache_key', '_volicon_acl_'); Cache::forever($cache_prefix . '_last_role_update', new MicrotimeDate()); }