Puncte:1

Cum să obțineți parametrul de la ruta dinamică în abonatul rutei

drapel ng

Î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. introduceți descrierea imaginii aici

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. introduceți descrierea imaginii aici

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;
  }

}
Jaypan avatar
drapel de
Postarea ta nu este foarte clara. Cine sunt ei'? Ce este „concentrarea”? Ce incerci sa faci? Ați arătat ceva cod, dar nu ați dat obiectivul clar sau chiar ați explicat clar ce nu funcționează. Ne-ați spus cum încercați să faceți ceva și ne-ați arătat codul care face ceva, dar niciodată nu ați explicat clar care este scopul final în termeni umani.
drapel ng
Ne pare rău, dar ar trebui să fie clar citind codul. Va adăuga mai multe detalii pentru oameni.
Jaypan avatar
drapel de
Încă nu văd scopul tău real, în afară de a încerca să rezolvi o problemă de codificare.Dar de ce faci măcar această codare? Care este obiectivul tău pentru utilizatorul front-end? Fără să știm care doriți să fie comportamentul așteptat, nu vă putem spune unde ați greșit, nici măcar nu vă putem spune dacă sunteți pe drumul cel bun cu abordarea dvs. sau dacă mergeți într-o direcție complet greșită. Există 10 moduri de a face orice în Drupal.
drapel cn
Definițiile rutei nu conțin valori ale parametrilor, acestea sunt disponibile numai atunci când este construită o rută. Răspunsul literal la ceea ce cred că este întrebarea dvs. este să adăugați un apel invers de acces personalizat pentru rută (așa cum este descris [aici](https://www.drupal.org/docs/8/api/routing-system/access- checking-on-routes/custom-route-access-checking)), dar ar putea exista o modalitate mai solidă de a rezolva problema dacă puteți edita întrebarea pentru a oferi mai mult context
drapel ng
Am adăugat câteva explicații suplimentare. Chiar nu știu cum să explic mai bine sau chiar mai simplu.
Puncte:1
drapel ng

Aș spune că codul tău eșuează pentru că nu există meniul entitate disponibilă începând cu convertor de parametri de meniu funcționează atunci când ruta este rezolvată după cum a comentat @Clive, nu în timpul construirii rutei, adică atunci când modifica evenimentul este concediat.

Pe de altă parte, de ce nu folosești Administrați meniuri și link-uri de meniu permisiunea de la core de a refuza accesul utilizatorului dvs. non-administrator la administrarea meniului? De asemenea, puteți folosi Permisiuni simple de meniu sau Administrator de meniu pe meniu module dacă doriți mai mult control asupra meniurilor dvs.

Dar dacă tot doriți să gestionați accesul la meniu singur, puteți face asta implementând dvs verificarea accesului propriu folosind abonatul de rută pe care îl aveți deja.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.