/**
  * Recursive function to add roles according to their parent role.
  *
  * @param Rbac $rbac
  * @param $roles
  * @param int $parentName
  * @return mixed
  */
 protected function recursiveRoles(Rbac $rbac, $roles, $parentName = 0)
 {
     if (!isset($roles[$parentName])) {
         return;
     }
     foreach ((array) $roles[$parentName] as $role) {
         if ($parentName) {
             $rbac->getRole($parentName)->addChild($role);
         } else {
             $rbac->addRole($role);
         }
         if (!empty($roles[$role])) {
             $this->recursiveroles($rbac, $roles, $role);
         }
     }
 }
Example #2
0
 /**
  * Load the requested resources into RBAC.
  *
  * @param Rbac $rbac
  * @param string $role
  * @param string|null $permission
  * @return \Doctrine\DBAL\Query\QueryBuilder
  */
 protected function load($rbac, $role, $permission = null)
 {
     $options = $this->options;
     $builder = new QueryBuilder($this->connection);
     // Role always present
     $builder->select('node.name')->from($options->getRoleTable(), 'node')->from($options->getRoleTable(), 'parent')->where('node.lft BETWEEN parent.lft AND parent.rgt')->andWhere('parent.name = :role')->orderBy('node.lft');
     $builder->setParameter('role', $role);
     // Permission optional
     if ($permission) {
         $builder->addSelect('permission.name AS permission')->leftJoin('node', 'role_permission', 'rp', 'node.id = rp.role_id')->leftJoin('node', 'permission', 'permission', 'rp.permission_id = permission.id')->andWhere('(permission.name = :permission OR permission.name IS NULL)');
         $builder->setParameter('permission', $permission);
     }
     $parent = null;
     foreach ($builder->execute() as $row) {
         if ($parent) {
             if (!$rbac->hasRole($row['name'])) {
                 $rbac->getRole($parent)->addChild($row['name']);
             }
         } else {
             if (!$rbac->hasRole($row['name'])) {
                 $rbac->addRole($row['name']);
             }
         }
         if ($permission) {
             if ($row['permission']) {
                 $rbac->getRole($row['name'])->addPermission($row['permission']);
             }
         }
         $parent = $row['name'];
     }
     return $builder;
 }