Я пытаюсь ограничить доступ для пользователей без прав администратора в admin/structure/menu, чтобы только администраторы могли создавать любые новые ссылки через admin/structure/menu.
Теперь я хочу, чтобы для одного специального меню с идентификатором "Фокус" кнопка "Добавить ссылку" была доступна и для другой роли.
Вот скриншот фактического бэкэнда с все еще доступной «Добавить ссылку». Я хочу, чтобы этого не было в Hauptnavigation, но не в Fokusnavigation.
То же самое, когда вы нажимаете на меню. Вы получаете кнопку «Добавить ссылку». Я могу отключить это с помощью приведенного ниже кода, но я не знаю, как снова разрешить его для ролей, не являющихся администраторами.
Я могу получить menu->id() в файле my_menu.module с тем же кодом, что и в routesubscriber ниже, но почему-то он не работает в routesubscriber.
Drush CR возвращает
Неустранимая ошибка PHP: Uncaught Error: вызов функции-члена id() для null в /var/www/html/web/modules/custom/my_menu/src/Routing/RouteSubscriber.php:31
Трассировки стека:
#0 /var/www/html/web/core/lib/Drupal/Core/Routing/RouteSubscriberBase.php(37): Drupal\my_menu\Routing\RouteSubscriber->alterRoutes(Object(Symfony\Component\Routing\RouteCollection))
#1 [внутренняя функция]: Drupal\Core\Routing\RouteSubscriberBase->onAlterRoutes(Object(Drupal\Core\Routing\RouteBuildEvent), 'routing.route_a...', Object(Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher))
#2 /var/www/html/web/core/lib/Drupal/Component/EventDispatcher/ContainerAwareEventDispatcher.php(142): call_user_func(Array, Object(Drupal\Core\Routing\RouteBuildEvent), 'routing.route_a... ', Объект(Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher))
#3 /var/www/html/web/core/lib/Drupal/Core/Routing/RouteBuilder.php(189): Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object(Drupal\Core\Routing\RouteBuildEvent), 'routing.route_a...')
в /var/www/html/web/modules/custom/my_menu/src/Routing/RouteSubscriber.php в строке 31
Есть ли другие способы получить значение? Что я делаю не так.
Вот мой код.
<?php
пространство имен Drupal\my_menu\Routing;
используйте Drupal\Core\Routing\RouteSubscriberBase;
используйте Drupal\Core\Routing\RoutingEvents;
используйте Symfony\Component\Routing\RouteCollection;
используйте Drupal\Core\Routing\RouteMatchInterface;
/**
* Класс RouteSubscriber
*
* скрытие компонентов редактирования меню для не-админов
*
* @пакет Drupal\hw_menu\Маршрутизация
*/
класс RouteSubscriber расширяет RouteSubscriberBase {
/**
* {@inheritdoc}
*/
общедоступная функция alterRoutes (RouteCollection $ collection) {
если ($ route = $ collection-> get ('entity.menu.add_link_form')) {
// dpm($route->getRequirements());
Экземпляр $menu\Drupal\system\Entity\Menu;
$menu = \Drupal::routeMatch()->getParameter('menu');
if($menu->id() != 'фокус') {
$route->setRequirement('_role', 'администратор');
}
// dpm($route->getRequirements());
}
}
/**
* {@inheritdoc}
*/
общедоступная статическая функция getSubscribedEvents() {
// Выполнить после content_translation, который имеет приоритет -210.
$events[RoutingEvents::ALTER] = ['onAlterRoutes', -230];
вернуть $события;
}
}