Рейтинг:1

Как получить параметр из динамического маршрута в подписчике маршрута

флаг ng

Я пытаюсь ограничить доступ для пользователей без прав администратора в 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];
    вернуть $события;
  }

}
Jaypan avatar
флаг de
Ваш пост не очень понятен. Кто они'? Что такое «фокус»? Что ты пытаешься сделать? Вы показали некоторый код, но не указали четкую цель или даже четко объяснили, что не работает. Вы рассказали нам, как вы пытаетесь что-то сделать, и показали код, который что-то делает, но вы так и не объяснили внятно, какова конечная цель с точки зрения человека.
флаг ng
Извините, хотя это должно быть ясно, прочитав код. Добавим дополнительные детали для людей.
Jaypan avatar
флаг de
Я до сих пор не вижу вашей реальной цели, кроме попытки решить какую-то проблему с кодированием.Но зачем ты вообще занимаешься этим кодированием? Какова ваша цель для внешнего пользователя? Не зная, каким вы хотите видеть ожидаемое поведение, мы не можем сказать вам, в чем вы ошибаетесь, мы даже не можем сказать вам, находитесь ли вы на правильном пути со своим подходом или вообще идете в совершенно неправильном направлении. В Drupal есть 10 способов сделать что угодно.
флаг cn
Определения маршрута не содержат значений параметров, они доступны только при построении маршрута. Буквальный ответ на ваш вопрос, как мне кажется, состоит в том, чтобы добавить настраиваемый обратный вызов доступа для маршрута (как описано [здесь] (https://www.drupal.org/docs/8/api/routing-system/access- проверка-на-маршрутах/проверка доступа к пользовательскому маршруту)), но может быть более надежный способ решить проблему, если вы можете отредактировать вопрос, чтобы предоставить больше контекста.
флаг ng
Добавил еще несколько пояснений. Я действительно не знаю, как объяснить это лучше или даже проще.
Рейтинг:1
флаг ng

Сказал бы, что ваш код не работает, потому что нет меню объект, доступный с момента преобразователь параметров меню работает, когда маршрут разрешается, как прокомментировал @Clive, а не во время построения маршрута, когда изменить событие запущено.

С другой стороны, почему бы вам не использовать Администрирование меню и ссылок меню разрешение от ядра, чтобы запретить доступ вашего пользователя без прав администратора к администрированию меню? Также вы можете использовать Разрешения простого меню или Меню администратора в меню модули, если вы хотите больше контролировать свои меню.

Но если вы все еще хотите управлять доступом к меню самостоятельно, вы можете сделать это, реализовав свой собственная проверка доступа используя абонента маршрута, который у вас уже есть.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.