Score:1

วิธีรับพารามิเตอร์จากเส้นทางแบบไดนามิกในสมาชิกเส้นทาง

ธง ng

ฉันกำลังพยายามจำกัดการเข้าถึงสำหรับผู้ใช้ที่ไม่ใช่ผู้ดูแลระบบในผู้ดูแลระบบ/โครงสร้าง/เมนู เพื่อให้ผู้ดูแลระบบเท่านั้นที่สามารถสร้างลิงก์ใหม่ผ่านทางผู้ดูแลระบบ/โครงสร้าง/เมนู
ตอนนี้ฉันต้องการให้เมนูพิเศษที่มีรหัส "โฟกัส" ปุ่ม "เพิ่มลิงก์" พร้อมใช้งานสำหรับบทบาทอื่นด้วย

นี่คือภาพหน้าจอของแบ็กเอนด์จริงโดยที่ "เพิ่มลิงก์" ยังใช้งานได้ ฉันต้องการให้สิ่งนี้หายไปสำหรับ Hauptnavigation แต่ไม่ใช่สำหรับ Fokusnavigation ป้อนคำอธิบายรูปภาพที่นี่

สิ่งเดียวกันเมื่อคุณคลิกที่เมนู คุณได้รับปุ่ม "เพิ่มลิงค์" ฉันสามารถปิดใช้งานสิ่งนี้ด้วยรหัสด้านล่าง แต่ฉันไม่ทราบวิธีอนุญาตสำหรับบทบาทที่ไม่ใช่ผู้ดูแลระบบอีกครั้ง ป้อนคำอธิบายรูปภาพที่นี่

ฉันสามารถรับ menu->id() ในไฟล์ my_menu.module ด้วยรหัสเดียวกันกับใน routesubscriber ด้านล่าง แต่อย่างใดมันไม่ทำงานใน routesubscriber Drush CR ส่งคืนค่า an

ข้อผิดพลาดร้ายแรงของ PHP: ข้อผิดพลาดที่ไม่ได้ตรวจสอบ: การเรียกไปยังฟังก์ชันสมาชิก id() เป็นโมฆะใน /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
 *
 * ซ่อนองค์ประกอบการแก้ไขเมนูสำหรับผู้ที่ไม่ใช่ผู้ดูแลระบบ
 *
 * @package Drupal\hw_menu\Routing
 */
คลาส 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('เมนู');
      if($menu->id() != 'โฟกัส') {
        $route->setRequirement('_role', 'administrator');
      }
    // dpm($route->getRequirements());
    }

  }

  /**
   * {@inheritdoc}
   */
  ฟังก์ชั่นคงที่สาธารณะ getSubscribedEvents () {
    // เรียกใช้หลังจาก content_translation ซึ่งมีลำดับความสำคัญ -210
    $events[RoutingEvents::ALTER] = ['onAlterRoutes', -230];
    ส่งคืนเหตุการณ์ $;
  }

}
Jaypan avatar
de flag
โพสต์ของคุณไม่ค่อยชัดเจน พวกเขาเป็นใคร'? 'โฟกัส' คืออะไร? คุณพยายามจะทำอะไร? คุณได้แสดงโค้ดบางส่วนแล้ว แต่ไม่ได้กำหนดเป้าหมายที่ชัดเจน หรือแม้แต่อธิบายอย่างชัดเจนว่าอะไรไม่ทำงาน คุณได้บอกเราว่าคุณกำลังพยายามทำบางสิ่งอย่างไร และแสดงโค้ดที่ทำบางอย่าง แต่คุณไม่เคยอธิบายอย่างชัดเจนว่าเป้าหมายสุดท้ายคืออะไรในแง่ของมนุษย์
ng flag
ขออภัย ฉันคิดว่าควรจะชัดเจนโดยการอ่านโค้ด จะเพิ่มรายละเอียดเพิ่มเติมสำหรับมนุษย์
Jaypan avatar
de flag
ฉันยังไม่เห็นเป้าหมายที่แท้จริงของคุณ นอกจากพยายามแก้ปัญหาการเข้ารหัสบางอย่างแต่ทำไมคุณถึงทำการเข้ารหัสนี้ เป้าหมายของคุณสำหรับผู้ใช้ส่วนหน้าคืออะไร? หากไม่รู้ว่าคุณต้องการให้พฤติกรรมที่คาดหวังเป็นอย่างไร เราไม่สามารถบอกคุณได้ว่าคุณผิดตรงไหน เราไม่สามารถแม้แต่จะบอกคุณได้ว่าคุณมาถูกทางแล้วหรือกำลังไปผิดทางโดยสิ้นเชิง มี 10 วิธีที่จะทำอะไรก็ได้ใน Drupal
cn flag
คำนิยามกระบวนการผลิตไม่มีค่าพารามิเตอร์ ซึ่งจะใช้ได้เฉพาะเมื่อมีการสร้างกระบวนการผลิตเท่านั้น คำตอบตามตัวอักษรสำหรับคำถามของคุณคือการเพิ่มการเรียกกลับการเข้าถึงที่กำหนดเองสำหรับเส้นทาง (ตามที่อธิบายไว้ [ที่นี่](https://www.drupal.org/docs/8/api/routing-system/access- การตรวจสอบบนเส้นทาง/การตรวจสอบการเข้าถึงเส้นทางที่กำหนดเอง)) แต่อาจมีวิธีที่มีประสิทธิภาพมากขึ้นในการแก้ปัญหาหากคุณสามารถแก้ไขคำถามเพื่อให้บริบทเพิ่มเติม
ng flag
เพิ่มคำอธิบายเพิ่มเติม ฉันไม่รู้จะอธิบายยังไงให้ดีกว่านี้หรือง่ายกว่านี้
Score:1
ธง ng

จะบอกว่ารหัสของคุณล้มเหลวเพราะไม่มี เมนู กิจการที่มีอยู่ตั้งแต่ ตัวแปลงพารามิเตอร์เมนู ทำงานเมื่อเส้นทางได้รับการแก้ไขตามที่แสดงความคิดเห็นโดย @Clive ไม่ใช่ระหว่างการสร้างเส้นทาง ซึ่งก็คือเมื่อ แก้ไข เหตุการณ์ถูกไล่ออก

ในทางกลับกัน ทำไมคุณไม่ใช้ จัดการเมนูและลิงค์เมนู การอนุญาตจากแกนหลักในการปฏิเสธการเข้าถึงการดูแลเมนูของผู้ใช้ที่ไม่ใช่ผู้ดูแลระบบของคุณ? นอกจากนี้ คุณสามารถใช้ สิทธิ์เมนูอย่างง่าย หรือ ผู้ดูแลเมนูต่อเมนู โมดูลถ้าคุณต้องการควบคุมเมนูของคุณมากขึ้น

แต่ถ้าคุณยังต้องการจัดการการเข้าถึงเมนูด้วยตัวเอง คุณสามารถทำได้โดยใช้ ตรวจสอบการเข้าถึงของตัวเอง โดยใช้สมาชิกเส้นทางที่คุณมีอยู่แล้ว

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา