/** * 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); } } }
/** * 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; }