如何重构这些多个其他-if块?有没有更好的方法

时间:2018-05-09 18:53:14

标签: php laravel laravel-5.4 php-7

此代码块检查项目或人员是否存在于特定组中,并授权仅查看那些存在的成员。有四个这样的组和多个场景或概率。这感觉就像代码气味,并希望要知道一个更好的方法.fyi:item1,item2,item3,item4是组的键

if ((in_array('item1', (Authorization::getAdmin($Id)))) &&
                (in_array('item2', (Authorization::getAdmin($Id)))) &&
                (in_array('item3', (Authorization::getAdmin($Id)))) &&
                ((in_array('item4', (Authorization::getAdmin($Id)))))) {


            }
            elseif ((in_array('item2', (Authorization::getAdmin($Id)))) &&
                ((in_array('item3', (Authorization::getAdmin($Id))))) &&
                ((in_array('item4', (Authorization::getAdmin($Id)))))){

            }

            elseif ((in_array('item1', (Authorization::getAdmin($Id)))) &&
                ((in_array('item3', (Authorization::getAdmin($Id))))) &&
                ((in_array('item4', (Authorization::getAdmin($Id)))))){

            }

            elseif ((in_array('item1', (Authorization::getAdmin($Id)))) &&
                ((in_array('item2', (Authorization::getAdmin($Id))))) &&
                ((in_array('item4', (Authorization::getAdmin($Id)))))){

            }

            elseif ((in_array('item3', (Authorization::getAdmin($Id)))) &&
                ((in_array('item2', (Authorization::getAdmin($Id))))) &&
                ((in_array('item4', (Authorization::getAdmin($Id)))))){

            }


            elseif ((in_array('item3', (Authorization::getAdmin($Id)))) &&
                ((in_array('item2', (Authorization::getAdmin($Id))))) &&
                ((in_array('item1', (Authorization::getAdmin($Id)))))){

            }


            elseif ((in_array('item2', (Authorization::getAdmin($Id)))) &&
                ((in_array('item3', (Authorization::getAdmin($Id)))))) {

            }

            elseif ((in_array('item3', (Authorization::getAdmin($Id)))) &&
                ((in_array('item1', (Authorization::getAdmin($Id)))))) {


            }

            elseif ((in_array('item1', (Authorization::getAdmin($Id)))) &&
                ((in_array('item2', (Authorization::getAdmin($Id)))))) {

            }


            elseif ((in_array('item1', (Authorization::getAdmin($Id)))) &&
                ((in_array('item4', (Authorization::getAdmin($Id)))))) {

            }

            elseif ((in_array('item4', (Authorization::getAdmin($Id)))) &&
                ((in_array('item2', (Authorization::getAdmin($Id)))))) {

            }

            elseif ((in_array('item4', (Authorization::getAdmin($Id)))) &&
                ((in_array('item3', (Authorization::getAdmin($Id)))))) {

            }

           elseif(in_array('item1',(Authorization::getAdmin($Id))))
           {

           }

            elseif(in_array('item2',(Authorization::getAdmin($Id))))
            {

            }

            elseif(in_array('item3',(Authorization::getAdmin($Id))))
            {

            }

            elseif(in_array('item4',(Authorization::getAdmin($Id))))
            {

            }


        }

2 个答案:

答案 0 :(得分:2)

如果我理解正确,你可以将其减少到:

$groups = Authorization::getAdmin($Id);

foreach (['item1', 'item2', 'item3', 'item4'] as $group_key) {
    if (in_array($group_key, $groups)) {
        // give authorization to view that group
    }
}

答案 1 :(得分:1)

绝对将静态函数调用结果放入局部变量中。这将为您节省大量处理能力并减少代码。

我喜欢Don't Panic的解决方案,并会扩展它以使用您的权限矩阵对其进行交叉索引...

$permissions = ['I can do this' => ['item1'], 'I can do that' => ['item1', 'item2'], ... ];
$groups = Authorization::getAdmin($Id);
$authorization = [];

foreach (['item1', 'item2', 'item3', 'item4'] as $group_key) {
  if (in_array($group_key, $groups)) {
    $authorization[] = $group_key;
  }
}

获得权限结果的方法是快速搜索数组。

$permission = array_search($authorization, $permissions );

这只会给你一个单一的结果;如果它比这更复杂,你可能需要构建一个复杂的语句来对其进行排序。