Điểm:1

Cách lấy tham số từ tuyến động trong thuê bao tuyến

lá cờ ng

Tôi đang cố gắng hạn chế quyền truy cập đối với người dùng không phải quản trị viên trên quản trị viên/cấu trúc/menu để chỉ quản trị viên mới có thể tạo bất kỳ liên kết mới nào qua quản trị viên/cấu trúc/menu.
Bây giờ tôi muốn rằng đối với một menu đặc biệt có ID "Tiêu điểm", nút "Thêm liên kết" cũng có sẵn cho một vai trò khác.

Đây là Ảnh chụp màn hình của chương trình phụ trợ thực tế với "Thêm liên kết" vẫn khả dụng. Tôi muốn tính năng này biến mất đối với Hauptnavigation chứ không phải đối với Fokusnavigation. nhập mô tả hình ảnh ở đây

Điều tương tự khi bạn nhấp vào Menu. Bạn nhận được nút "Thêm liên kết". Tôi có thể tắt tính năng này bằng mã bên dưới, nhưng tôi không biết cách cho phép lại tính năng này đối với các Vai trò không phải Quản trị viên. nhập mô tả hình ảnh ở đây

Tôi có thể lấy menu->id() trong tệp my_menu.module, với mã giống như trong trình đăng ký định tuyến bên dưới nhưng không hiểu sao nó không hoạt động trong trình đăng ký tuyến. Drush CR trả về một

PHP Fatal error: Uncaught Error: Call to a member function id() on null in /var/www/html/web/modules/custom/my_menu/src/Routing/RouteSubscriber.php:31                                                                                                                
Dấu vết ngăn xếp:                                                                                                                                                                                                                                                           
#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 [chức năng nội bộ]: 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... ', Đối tượng (Drupal\Thành phần\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...')                                                   
 trong /var/www/html/web/modules/custom/my_menu/src/Routing/RouteSubscriber.php trên dòng 31       

Có những cách khác để có được giá trị? Tôi đang làm gì sai.
Đây là mã của tôi.

<?php

không gian tên Drupal\my_menu\Routing;

sử dụng Drupal\Core\Routing\RouteSubscriberBase;
sử dụng Drupal\Core\Routing\RoutingEvents;
sử dụng Symfony\Component\Routing\RouteCollection;
sử dụng Drupal\Core\Routing\RouteMatchInterface;

/**
 * Lớp RouteSubscriber
 *
 * ẩn các thành phần chỉnh sửa menu cho những người không phải quản trị viên
 *
 * @package Drupal\hw_menu\Routing
 */
lớp RouteSubscriber mở rộng RouteSubscriberBase {

  /**
   * {@inheritdoc}
   */
  chức năng công cộng alterRoutes(RouteCollection $collection) {


    if ($route = $collection->get('entity.menu.add_link_form')) {

  // dpm($route->getRequirements());

      $menu instanceof \Drupal\system\Entity\Menu;
      $menu = \Drupal::routeMatch()->getParameter('menu');
      if($menu->id() != 'tiêu điểm') {
        $route->setRequirement('_vai trò', 'quản trị viên');
      }
    // dpm($route->getRequirements());
    }

  }

  /**
   * {@inheritdoc}
   */
  hàm tĩnh công khai getSubscribeEvents() {
    // Chạy theo content_translation, cái này có priority -210.
    $events[RoutingEvents::ALTER] = ['onAlterRoutes', -230];
    trả lại sự kiện $;
  }

}
Jaypan avatar
lá cờ de
Bài viết của bạn không rõ ràng lắm. 'Họ' là ai? "tập trung" là gì? Bạn đang cố làm gì vậy? Bạn đã hiển thị một số mã, nhưng không đưa ra mục tiêu rõ ràng hoặc thậm chí không giải thích rõ ràng những gì không hoạt động. Bạn đã cho chúng tôi biết bạn đang cố gắng làm điều gì đó như thế nào và hiển thị mã thực hiện điều gì đó, nhưng bạn chưa bao giờ giải thích rõ ràng mục tiêu cuối cùng là gì theo thuật ngữ của con người.
lá cờ ng
Xin lỗi, nghĩ rằng nó phải rõ ràng bằng cách đọc mã. Sẽ thêm chi tiết cho con người.
Jaypan avatar
lá cờ de
Tôi vẫn không thấy mục tiêu thực sự của bạn, ngoài việc cố gắng giải quyết một số vấn đề về mã hóa.Nhưng tại sao bạn thậm chí còn làm việc viết mã này? Mục tiêu của bạn cho người dùng front-end là gì? Không biết bạn muốn hành vi dự kiến ​​sẽ như thế nào, chúng tôi không thể cho bạn biết bạn đang sai ở đâu, chúng tôi thậm chí không thể cho bạn biết liệu bạn có đang đi đúng hướng với cách tiếp cận của mình hay đang hoàn toàn đi sai hướng. Có 10 cách để làm bất cứ điều gì trong Drupal.
lá cờ cn
Định nghĩa tuyến đường không chứa các giá trị tham số, chúng chỉ khả dụng khi tuyến đường được tạo. Câu trả lời theo nghĩa đen cho những gì tôi nghĩ câu hỏi của bạn là thêm lệnh gọi lại quyền truy cập tùy chỉnh cho tuyến đường (như được mô tả [tại đây](https://www.drupal.org/docs/8/api/routing-system/access- kiểm tra tuyến đường/kiểm tra quyền truy cập tuyến đường tùy chỉnh)), nhưng có thể có một cách mạnh mẽ hơn để giải quyết vấn đề nếu bạn có thể chỉnh sửa câu hỏi để cung cấp thêm ngữ cảnh
lá cờ ng
Đã thêm một số lời giải thích. Tôi thực sự không biết làm thế nào để giải thích nó tốt hơn hoặc thậm chí đơn giản hơn.
Điểm:1
lá cờ ng

Có thể nói rằng mã của bạn bị lỗi vì không có thực đơn thực thể có sẵn kể từ khi trình chuyển đổi tham số menu hoạt động khi tuyến đường được giải quyết như nhận xét của @Clive không phải trong quá trình xây dựng tuyến đường, đó là khi thay đổi sự kiện được kích hoạt.

Mặt khác, tại sao bạn không sử dụng Quản lý menu và liên kết menu quyền từ lõi để từ chối quyền truy cập của người dùng không phải quản trị viên của bạn vào quản trị menu? Ngoài ra bạn có thể sử dụng Quyền đơn giản hoặc là Menu Quản trị trên mỗi Menu modules nếu bạn muốn kiểm soát nhiều hơn các menu của mình.

Nhưng nếu bạn vẫn muốn tự mình xử lý việc truy cập menu, bạn có thể thực hiện việc đó bằng cách triển khai kiểm tra truy cập riêng sử dụng thuê bao tuyến đường bạn đã có.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.