You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							212 lines
						
					
					
						
							6.2 KiB
						
					
					
				
			
		
		
	
	
							212 lines
						
					
					
						
							6.2 KiB
						
					
					
				| <?php | |
| /** | |
|  * Created by Error202 | |
|  * Date: 13.08.2017 | |
|  */ | |
|  | |
| namespace core\services; | |
|  | |
| use yii\helpers\ArrayHelper; | |
| use yii\rbac\ManagerInterface; | |
| use yii\rbac\Role; | |
| use yii\helpers\Json; | |
|  | |
| class RoleManager | |
| { | |
|     private $manager; | |
|  | |
|     public function __construct(ManagerInterface $manager) | |
|     { | |
|         $this->manager = $manager; | |
|     } | |
|  | |
|     public function assign($userId, $name) | |
|     { | |
|         $am = $this->manager; | |
|         $am->revokeAll($userId); | |
|         if (!$role = $am->getRole($name)) { | |
|             throw new \DomainException('Role "' . $name . '" does not exist.'); | |
|         } | |
|         $am->revokeAll($userId); | |
|         $am->assign($role, $userId); | |
|     } | |
|  | |
|     public function create($name, $description = '', $ruleName = null, $data = null) | |
|     { | |
|         $am = $this->manager; | |
|         if ($role = $am->getRole($name)) { | |
|             throw new \DomainException('Role "' . $name . '" is already exist.'); | |
|         } | |
|         $newRole = $am->createRole($name); | |
|         $newRole->description = $description; | |
|         $newRole->data = $data == null ? null : Json::decode($data); | |
|         $newRole->ruleName = empty($ruleName) ? null : $ruleName; | |
|         try { | |
|             $am->add($newRole); | |
|         } | |
|         catch (\ReflectionException $e) | |
|         { | |
|             throw new \DomainException($e->getMessage()); | |
|         } | |
|     } | |
|  | |
|     public function update($name, $newName, $description = '', $ruleName = null, $data = null) | |
|     { | |
|         $am = $this->manager; | |
|         if (!$role = $am->getRole($name)) { | |
|             throw new \DomainException('Role "' . $name . '" does not exist.'); | |
|         } | |
|         if (($name == 'admin' || $name == 'user') && $name != $newName) | |
|         { | |
|             throw new \DomainException('Role "' . $name . '" can not be renamed.'); | |
|         } | |
|         $role->name = $newName; | |
|         $role->description = $description; | |
|         $role->ruleName = empty($ruleName) ? null : $ruleName; | |
|         $role->data = $data == null ? null : Json::decode($data); | |
|         try { | |
|             $am->update($name, $role); | |
|         } | |
|         catch (\ReflectionException $e) | |
|         { | |
|             throw new \DomainException($e->getMessage()); | |
|         } | |
|     } | |
|  | |
|     public function delete($name) | |
|     { | |
|         $am = $this->manager; | |
|         if (!$role = $am->getRole($name)) { | |
|             throw new \DomainException('Role "' . $name . '" does not exist.'); | |
|         } | |
|         if ($role->name == 'admin' || $role->name == 'user') | |
|         { | |
|             throw new \DomainException('Can not delete role "' . $name . '"'); | |
|         } | |
|         $am->remove($role); | |
|     } | |
|  | |
|     public function child($parentRoleName, $childRoleName) | |
|     { | |
|         $am = $this->manager; | |
|         if (!$parentRole = $am->getRole($parentRoleName)) { | |
|             throw new \DomainException('Parent role "' . $parentRoleName . '" does not exist.'); | |
|         } | |
|         if (!$childRole = $am->getRole($childRoleName)) { | |
|             throw new \DomainException('Child role "' . $childRoleName . '" does not exist.'); | |
|         } | |
|         if ($parentRoleName == $childRoleName) | |
|         { | |
|             throw new \DomainException('Can not add a role to yourself.'); | |
|         } | |
|         $am->addChild($parentRole, $childRole); | |
|     } | |
|  | |
|     public function killchild($parentRoleName, $childRoleName) | |
|     { | |
|         $am = $this->manager; | |
|         if (!$parentRole = $am->getRole($parentRoleName)) { | |
|             throw new \DomainException('Parent role "' . $parentRoleName . '" does not exist.'); | |
|         } | |
|         if (!$childRole = $am->getRole($childRoleName)) { | |
|             throw new \DomainException('Child role "' . $childRoleName . '" does not exist.'); | |
|         } | |
|         if ($parentRoleName == $childRoleName) | |
|         { | |
|             throw new \DomainException('Can not kill yourself as child.'); | |
|         } | |
|         if (!$am->hasChild($parentRole, $childRole)) | |
|         { | |
|             throw new \DomainException('Role "' . $childRoleName . '" does not assigned to "' . $parentRoleName . '".'); | |
|         } | |
|         $am->removeChild($parentRole, $childRole); | |
|     } | |
|  | |
|     public function getRoles() | |
|     { | |
|         $am = $this->manager; | |
|         return $am->getRoles(); | |
|     } | |
|  | |
|     public function getRole($name) | |
|     { | |
|         $am = $this->manager; | |
|         if (!$role = $am->getRole($name)) { | |
|             throw new \DomainException('Role "' . $name . '" does not exist.'); | |
|         } | |
|         return $role; | |
|     } | |
|  | |
|     public function getChildRoles($name) | |
|     { | |
|         $am = $this->manager; | |
|         return $am->getChildRoles($name); | |
|     } | |
|  | |
|     public function getRolesNamesByUser($id) | |
|     { | |
|         $am = $this->manager; | |
|         $roles = $am->getRolesByUser($id); | |
|         return array_map(function(Role $role){ | |
|             return $role->name; | |
|         }, $roles); | |
|     } | |
|  | |
|     public function getRolesListArray() | |
|     { | |
|         $data = array_map(function (Role $role){ | |
|             return [ | |
|                 'name' => $role->name, | |
|                 'description' => $role->description, | |
|             ]; | |
|         }, $this->getRoles()); | |
|         return $data; | |
|     } | |
|  | |
|     public function getRolesSelectArray() | |
|     { | |
|         $data = ArrayHelper::map($this->getRoles(), 'name', 'description'); | |
|         return $data; | |
|     } | |
|  | |
|     public function getRolesSelectArrayByRole($id) | |
|     { | |
|         $am = $this->manager; | |
|         $data = ArrayHelper::getColumn($am->getChildRoles($id), 'name'); | |
|         return $data; | |
|     } | |
|  | |
|     public function saveChildren($roleName, $rolesNames, $permissionNames) | |
|     { | |
|         $am = $this->manager; | |
|         $role = $am->getRole($roleName); | |
|         $am->removeChildren($role); | |
|  | |
|         if (is_array($rolesNames) && !empty($rolesNames)) { | |
|             foreach ($rolesNames as $name) { | |
|                 $childRole = $am->getRole($name); | |
|                 $am->addChild($role, $childRole); | |
|             } | |
|         } | |
|  | |
|         if (is_array($permissionNames) && !empty($permissionNames)) { | |
|             foreach ($permissionNames as $name) { | |
|                 $childPermission = $am->getPermission($name); | |
|                 $am->addChild($role, $childPermission); | |
|             } | |
|         } | |
|     } | |
|  | |
|     public static function getCurrentRoleName() | |
|     { | |
|         $roles = \Yii::$app->authManager->getRolesByUser(\Yii::$app->user->id); | |
|         if (!$roles) { | |
|             return null; | |
|         } | |
|         reset($roles); | |
|         /* @var $role \yii\rbac\Role */ | |
|         $role = current($roles); | |
|  | |
|         return $role->name; | |
|     } | |
| } |