proudmore
@proudmore

Почему не стирается ключ из массива?

Привет, тостер.
Столкнулся со странной ситуацией:
Есть рекурсивный метод, который обходит конфиг меню и нормализует его в зависимости от прав пользователя.
Чтобы проиллюстрировать проблему, приложу сам метод и проблемный участок конфига:

['label' => 'Cars', 'url' => '#', 'icon' => 'car', 'items' => [
        ['label' => 'List', 'icon' => 'list', 'url' => '/cars'],
        ['label' => 'CreateCar', 'icon' => 'plus', 'roles' => ['admin'], 'url' => '/cars/create'],
    ]]


static public function build( $menuConfig = '' ) {
        $menu = require_once \Yii::getAlias($menuConfig);

        static::normalizeMenu( $menu, \Yii::$app->user->identity->roles);

        return $menu;
    }

    protected static function normalizeMenu(&$menu, $roles)
    {
        foreach ($menu as $key => $menuItem) {
            if (isset($menuItem['roles'])) {
                $allowForRoles = false;

                if (isset($menuItem['roles']) && !empty($menuItem['roles'])) {
                    foreach ($roles as $roleName => $roleObject) {
                        if (in_array($roleName, $menuItem['roles'])) {
                            $allowForRoles = true;
                            break;
                        }
                    }
                    
                } else {
                    $allowForRoles = true;
                }

                if (!$allowForRoles) {
                    unset($menu[$key]);
                }
            } elseif (isset($menuItem['items'])) {
                static::normalizeMenu($menuItem['items'], $roles);
            }
        }
    }


У моего юзера нет роли admin, но при этом я все равно вижу пункт CreateCar. Подозреваю, что тут какая-то штука со ссылками, т.к. условия выполняются верно и этот подпункт удаляется. Но это странно, т.к. метод принимает ссылку на меню, и модифицирует исходное. А т.к. метод рекурсивный, то я всегда взаимодействую с исходным переданным меню.
Буду рад если сообщество поможет разобрать эту ситуацию по косточкам.
  • Вопрос задан
  • 155 просмотров
Решения вопроса 1
Decadal
@Decadal
foreach ($menu as $key => $menuItem)
в этом месте ваша ссылка теряется.
$menuItem здесь временная переменная, изменение которой ничего не даст.
попробуйте &$menuItem написать прямо в цикле
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы