【发布时间】:2014-01-04 03:29:11
【问题描述】:
我有一些逻辑是我前一阵子拼凑起来的,现在我需要使它成为通用的,以便在无限数量的父级上寻找父级。将此代码构造为循环而不是我的意大利面条巢的最有效方法是什么?
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;
}
【问题讨论】:
-
哇,这真是个兔子窝。看看自递归应该做你想做的事:)