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; | 
						|
    } | 
						|
} |