Привет, тостер.
Столкнулся со странной ситуацией:
Есть рекурсивный метод, который обходит конфиг меню и нормализует его в зависимости от прав пользователя.
Чтобы проиллюстрировать проблему, приложу сам метод и проблемный участок конфига:
['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. Подозреваю, что тут какая-то штука со ссылками, т.к. условия выполняются верно и этот подпункт удаляется. Но это странно, т.к. метод принимает ссылку на меню, и модифицирует исходное. А т.к. метод рекурсивный, то я всегда взаимодействую с исходным переданным меню.
Буду рад если сообщество поможет разобрать эту ситуацию по косточкам.