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.
		
		
		
		
		
			
		
			
				
					
					
						
							137 lines
						
					
					
						
							4.0 KiB
						
					
					
				
			
		
		
	
	
							137 lines
						
					
					
						
							4.0 KiB
						
					
					
				<?php | 
						|
/** | 
						|
 * Created by Error202 | 
						|
 * Date: 15.08.2017 | 
						|
 */ | 
						|
 | 
						|
namespace core\services; | 
						|
 | 
						|
use yii\rbac\ManagerInterface; | 
						|
//use yii\rbac\Permission; | 
						|
use yii\helpers\Json; | 
						|
use yii\helpers\ArrayHelper; | 
						|
 | 
						|
class PermissionManager | 
						|
{ | 
						|
    private $manager; | 
						|
 | 
						|
    public function __construct(ManagerInterface $manager) | 
						|
    { | 
						|
        $this->manager = $manager; | 
						|
    } | 
						|
 | 
						|
    public function create($name, $description = '', $ruleName = null, $data = null) | 
						|
    { | 
						|
        $am = $this->manager; | 
						|
        if ($permission = $am->getPermission($name)) { | 
						|
            throw new \DomainException('Permission "' . $name . '" is already exist.'); | 
						|
        } | 
						|
        $newPermission = $am->createPermission($name); | 
						|
        $newPermission->description = $description; | 
						|
        $newPermission->data = $data == null ? null : Json::decode($data); | 
						|
        $newPermission->ruleName = empty($ruleName) ? null : $ruleName; | 
						|
        try { | 
						|
            $am->add($newPermission); | 
						|
        } | 
						|
        catch (\ReflectionException $e) | 
						|
        { | 
						|
            throw new \DomainException($e->getMessage()); | 
						|
        } | 
						|
    } | 
						|
 | 
						|
    public function update($name, $newName, $description = '', $ruleName = null, $data = null) | 
						|
    { | 
						|
        $am = $this->manager; | 
						|
        if (!$permission = $am->getPermission($name)) { | 
						|
            throw new \DomainException('Permission "' . $name . '" does not exist.'); | 
						|
        } | 
						|
        $permission->name = $newName; | 
						|
        $permission->description = $description; | 
						|
        $permission->ruleName = empty($ruleName) ? null : $ruleName; | 
						|
        $permission->data = $data == null ? null : Json::decode($data); | 
						|
        try { | 
						|
            $am->update($name, $permission); | 
						|
        } | 
						|
        catch (\ReflectionException $e) | 
						|
        { | 
						|
            throw new \DomainException($e->getMessage()); | 
						|
        } | 
						|
    } | 
						|
 | 
						|
    public function delete($name) | 
						|
    { | 
						|
        $am = $this->manager; | 
						|
        if (!$permission = $am->getPermission($name)) | 
						|
        { | 
						|
            throw new \DomainException('Permission "' . $name . '" does not exist.'); | 
						|
        } | 
						|
        $am->remove($permission); | 
						|
    } | 
						|
 | 
						|
    public function assign($roleName, $permissionName) | 
						|
    { | 
						|
        $am = $this->manager; | 
						|
        if (!$role = $am->getRole($roleName)) { | 
						|
            throw new \DomainException('Role "' . $roleName . '" does not exist.'); | 
						|
        } | 
						|
        if (!$permission = $am->getPermission($permissionName)) | 
						|
        { | 
						|
            throw new \DomainException('Permission "' . $permissionName . '" does not exist.'); | 
						|
        } | 
						|
        $am->addChild($role, $permission); | 
						|
    } | 
						|
 | 
						|
    public function unassign($roleName, $permissionName) | 
						|
    { | 
						|
        $am = $this->manager; | 
						|
        if (!$role = $am->getRole($roleName)) { | 
						|
            throw new \DomainException('Role "' . $roleName . '" does not exist.'); | 
						|
        } | 
						|
        if (!$permission = $am->getPermission($permissionName)) | 
						|
        { | 
						|
            throw new \DomainException('Permission "' . $permissionName . '" does not exist.'); | 
						|
        } | 
						|
        if (!$am->hasChild($role, $permission)) | 
						|
        { | 
						|
            throw new \DomainException('Permission "' . $permissionName . '" does not assigned to "' . $roleName . '".'); | 
						|
        } | 
						|
        $am->removeChild($role, $permission); | 
						|
    } | 
						|
 | 
						|
    public function getPermissions() | 
						|
    { | 
						|
        $am = $this->manager; | 
						|
        return $am->getPermissions(); | 
						|
    } | 
						|
 | 
						|
    public function getPermission($name) | 
						|
    { | 
						|
        $am = $this->manager; | 
						|
        if (!$permission = $am->getPermission($name)) { | 
						|
            throw new \DomainException('Permission "' . $name . '" does not exist.'); | 
						|
        } | 
						|
        return $permission; | 
						|
    } | 
						|
 | 
						|
    public function permissionExists($name): bool | 
						|
    { | 
						|
	    $am = $this->manager; | 
						|
	    if (!$permission = $am->getPermission($name)) { | 
						|
		    return false; | 
						|
	    } | 
						|
	    return true; | 
						|
    } | 
						|
 | 
						|
    public function getPermissionsSelectArray() | 
						|
    { | 
						|
        $data = ArrayHelper::map($this->getPermissions(), 'name', 'description'); | 
						|
        return $data; | 
						|
    } | 
						|
 | 
						|
    public function getPermissionsSelectArrayByRole($id) | 
						|
    { | 
						|
        $am = $this->manager; | 
						|
        $data = ArrayHelper::getColumn($am->getPermissionsByRole($id), 'name'); | 
						|
        return $data; | 
						|
    } | 
						|
} |