Încerc să restricționez accesul utilizatorilor non-administratori pe admin/structură/meniu, astfel încât numai administratorii să poată crea orice link-uri noi prin admin/structură/meniu.
Acum vreau ca pentru un meniu special cu ID-ul „Focus” butonul „Add Link” să fie disponibil și pentru alt rol.
Iată o captură de ecran a backend-ului real cu „Adăugați link” încă disponibil. Vreau să dispară pentru Hauptnavigation, dar nu pentru Fokusnavigation.

Același lucru când dați clic pe un meniu. Primiți un buton „Adăugați link”. Pot dezactiva acest lucru cu codul meu de mai jos, dar nu știu cum să-l permit din nou pentru roluri care nu sunt de administrator.

Pot obține meniu->id() în fișierul my_menu.module, cu același cod ca în routesubscriber de mai jos, dar cumva nu funcționează în routesubscriber.
Drush CR returnează un
Eroare fatală PHP: Eroare neprinsă: Apelarea unei funcții membru id() pe null în /var/www/html/web/modules/custom/my_menu/src/Routing/RouteSubscriber.php:31
Urmărirea stivei:
#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 [funcție internă]: 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... ', Object(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...')
în /var/www/html/web/modules/custom/my_menu/src/Routing/RouteSubscriber.php pe linia 31
Există și alte modalități de a obține valoarea? Ce fac greșit.
Aici este codul meu.
<?php
spațiu de nume Drupal\meniul_meu\Routing;
utilizați Drupal\Core\Routing\RouteSubscriberBase;
utilizați Drupal\Core\Routing\RoutingEvents;
utilizați Symfony\Component\Routing\RouteCollection;
utilizați Drupal\Core\Routing\RouteMatchInterface;
/**
* Clasa RouteSubscriber
*
* ascunderea componentelor de editare a meniului pentru non-administratori
*
* @pachet Drupal\hw_menu\Routing
*/
clasa RouteSubscriber extinde RouteSubscriberBase {
/**
* {@inheritdoc}
*/
funcția publică alterRoutes(RouteCollection $colecție) {
dacă ($rută = $colecție->get('entity.menu.add_link_form')) {
// dpm($route->getRequirements());
$menu instanță a \Drupal\system\Entity\Menu;
$meniu = \Drupal::routeMatch()->getParameter('meniu');
if($menu->id() != 'concentrare') {
$route->setRequirement('_rol', 'administrator');
}
// dpm($route->getRequirements());
}
}
/**
* {@inheritdoc}
*/
funcție publică statică getSubscribedEvents() {
// Rulați după traducere_conținut, care are prioritate -210.
$events[RoutingEvents::ALTER] = ['onAlterRoutes', -230];
returnează $evenimente;
}
}