I have some logics that I bashed together a while ago, and now I need to make it generic so as to look for a parent on an infinite number of parent-levels. What would be the most efficient way of structuring this code as a loop instead of my spaghetti-nests?
public function hasAccess($user,$container)
{
//If user is admin
$roles = $user->getRoles();
foreach ($roles as $role) {
if ($role == 'ROLE_ADMIN') {
return true;
}
};
//Or if user has access to object
foreach ($container->getUsers() as $userWithAccess) {
if ($userWithAccess == $user) {
return true;
}
}
//Or if object has parent and user has access to the parent
$parent = $container->getParent();
if ($parent) {
foreach ($parent->getUsers() as $userWithAccess) {
if ($userWithAccess == $user) {
return true;
}
}
}
//Or if object has grandparent and user has access to the grandparent
$parent = $container->getParent();
if ($parent) {
$grandparent = $parent->getParent();
if ($grandparent) {
foreach ($grandparent->getUsers() as $userWithAccess) {
if ($userWithAccess == $user) {
return true;
}
}
}
}
//Or if object has greatgrandparent (=entire company access) and user has access to the greatgrandparent ('entire company')
$parent = $container->getParent();
if ($parent) {
$grandparent = $parent->getParent();
if ($grandparent) {
$greatgrandparent = $grandparent->getParent();
if ($greatgrandparent) {
foreach ($greatgrandparent->getUsers() as $userWithAccess) {
if ($userWithAccess == $user) {
return true;
}
}
}
}
}
//Or if object has greatgreatgrandparent (=entire company if this content lives within a module, otherwise this level doesn't exist) and user has access to the greatgreatgrandparent (ie entire company)
$parent = $container->getParent();
if ($parent) {
$grandparent = $parent->getParent();
if ($grandparent) {
$greatgrandparent = $grandparent->getParent();
if ($greatgrandparent) {
$greatgreatgrandparent = $greatgrandparent->getParent();
if ($greatgreatgrandparent) {
foreach ($greatgreatgrandparent->getUsers() as $userWithAccess) {
if ($userWithAccess == $user) {
return true;
}
}
}
}
}
}
//At the moment, access to 'entire company' does NOT grant access to monitors outside the hierarchy.
//It is still possible to add privileges to those individual monitors.
//If none of the above has matched...
return false;
}