Điểm:1

Cách vô hiệu hóa bộ đệm Breadcrumbs cho các nút con trên graphQl

lá cờ gb

tôi có ví dụ nút A với bí danh nút-anút B với bí danh nút-a/nút-b như vậy trên của tôi nút B tôi có mẩu bánh mì này Trang chủ > Nút A > Nút B

Kết quả GraphQl:

"breadcrumbs": [
                {
                    "văn bản": "Trang chủ",
                    "url": {
                        "con đường": "/",
                        "định tuyến": đúng
                    }
                },
                {
                    "văn bản": "Nút A",
                    "url": {
                        "đường dẫn": "http://example.com/node-a",
                        "định tuyến": đúng
                    }
                },
                {
                    "văn bản": "Nút B",
                    "url": {
                        "con đường": "",
                        "định tuyến": đúng
                    }
                }
            ]

Nhưng khi tôi thay đổi nút A tiêu đề tôi luôn nhận được cùng một kết quả (đường dẫn không thay đổi), nhưng khi tôi lưu lại nút A hoặc xóa bộ đệm thay đổi kết quả graphQl.

Đây là những gì tôi đã thử:

  1. Xóa bộ đệm graphQl (kết quả và định nghĩa) khi cập nhật nút:

     /**
     * Triển khai hook_ENTITY_TYPE_update().
     */
    chức năng MYMODULE_node_update(EntityInterface $entity) {
      // Xóa bộ đệm graphql.
      /** @var \Drupal\Core\Cache\CacheBackendInterface $graphql_results_cache */
      $graphql_results_cache = \Drupal::service('cache.graphql.results');
      $graphql_results_cache->invalidateAll();
      /** @var \Drupal\Core\Cache\CacheBackendInterface $graphql_definitions_cache */
      $graphql_definitions_cache = \Drupal::service('cache.graphql.definitions');
      $graphql_definitions_cache->invalidateAll();
    }

nó không hoạt động!

  1. Xóa bộ nhớ cache của tất cả các nút con khi cập nhật nút như thế này:

    /**
     * Triển khai hook_ENTITY_TYPE_update().
     */
    chức năng MYMODULE_node_update(EntityInterface $entity) {
      $database = \Drupal::database();
      // Lấy bí danh đường dẫn nút hiện tại.
      $alias = \Drupal::service('path_alias.manager')
        ->getAliasByPath('/node/' . $entity->id());
      // Lấy tất cả các nút con của nút hiện tại.
      $child_nodes_alias = $database->select('path_alias', 'pa')->fields('pa', [
        'con đường',
        'bí danh',
      ])->điều kiện('đường dẫn', '/nút/%', 'THÍCH')
        ->điều kiện('bí danh', $bí danh . '%', 'THÍCH')
        ->thực thi()
        ->fetchAll();
      // Vô hiệu hóa bộ đệm cho mỗi nút con của nút hiện tại.
      foreach ($child_nodes_alias as $alias_data) {
        $nid = phát nổ('/', $alias_data->path)[2] ?? VÔ GIÁ TRỊ;
        if ($nid && $nid != $entity->id()) {
          $tags = ['nút:' . $nid];
          Bộ nhớ đệm::invalidateTags($tags);
          \Drupal::entityTypeManager()->getStorage('node')->resetCache([$nid]);
        }
      }
    }

nó cũng không hoạt động

  1. Tôi đã kết hợp hai cách trước đó nó cũng không hoạt động.

Khi tôi xóa tất cả bộ đệm khi cập nhật nút, nó hoạt động, nhưng đó không phải là cách tốt nhất để nó tác động đến bộ đệm của trang.


/**
 * Triển khai hook_ENTITY_TYPE_update().
 */
chức năng MYMODULE_node_update(EntityInterface $entity) {
  drupal_flush_all_caches();
}

Cách tốt nhất để xóa bộ đệm breadcrumbs hoặc các nút con mà không xóa tất cả bộ đệm của trang là gì?

Chỉnh sửa: Cảm ơn bạn @4K4 đối với nhận xét của bạn, tôi đã cố gắng thêm CacheTags vào quá breadcrumb nhưng tôi cũng không hoạt động!


/**
 * Triển khai hook_system_breadcrumb_alter().
 */
function MYMODULE_system_breadcrumb_alter(Breadcrumb &$breadcrumb, RouteMatchInterface $route_match, mảng $context) {
  // Nối tiêu đề trang hiện tại vào breadcrumb cho các tuyến không phải quản trị viên.
  if ($breadcrumb && !\Drupal::service('router.admin_context')->isAdminRoute()) {
    $links = $breadcrumb->getLinks();
    foreach ($liên kết dưới dạng $link) {
      $parameters = $link->getUrl()->getRouteParameters();
      nếu ($ tham số) {
        // Đảm bảo breadcrumb được cập nhật khi tiêu đề nút thay đổi.
        $breadcrumb->addCacheTags(['node:' . $parameters['node']]);
        $breadcrumb->addCacheContexts(['url']);
      }
    }
  }
}

Ghi chú: Breadcrumb dễ dàng mô-đun được cài đặt.

Kevin avatar
lá cờ in
Chúng có thực sự được liên kết trong menu không? Làm thế nào họ được kết nối khác? Bí danh không ngụ ý phụ thuộc vào bộ đệm.
4uk4 avatar
lá cờ cn
Thông thường, bạn không giải quyết được các vấn đề về bộ nhớ đệm trong hook_node_update(). Plugin GraphQL xây dựng breadcrumb phải thêm các thẻ bộ đệm và sau đó chúng tự động bị vô hiệu hóa khi một nút được lưu.
berramou avatar
lá cờ gb
tôi đã cố gắng thêm thẻ bộ đệm nút vào mẩu bánh mì như tôi đã đề cập trong bản chỉnh sửa của mình và nó không hoạt động, có lẽ tôi nên thêm một thẻ bộ đệm khác, tôi đang thiếu gì?
berramou avatar
lá cờ gb
@Kevin không, chúng không được liên kết trong menu, mẩu bánh mì được tạo tự động bằng mô-đun Easy Breadcrumb
4uk4 avatar
lá cờ cn
OK, với điều kiện là breadcrumbs có tất cả các thẻ bộ đệm cần thiết, vẫn chưa rõ mã nào đang tạo kết quả GraphQL. Không thể tìm thấy plugin như vậy trong mô-đun chính. Bạn có một mô-đun bổ sung cho điều đó?
berramou avatar
lá cờ gb
Không có mô-đun bổ sung cho breadcrumbs, tôi sử dụng mô-đun qraphQl officiel phiên bản 3.X. Tôi đã tìm thấy trường Breadcrumb được xác định tại đây **graphql/modules/graphql_core/src/Plugin/GraphQL/Fields/Breadcrumbs/Breadcrumbs.php**
4uk4 avatar
lá cờ cn
Đây là phiên bản trước.[Bản cập nhật mới nhất](https://git.drupalcode.org/project/graphql/-/commit/58a9b7464bc6cf4aa78632a0efee83f911c8522e) cho đối tượng mã này đã giải quyết chính xác vấn đề này nhưng tôi không biết liệu bản cập nhật này có thành công hay không. Bạn có thể báo cáo sự cố nếu bạn có thể tạo lại các thẻ bộ nhớ cache bị thiếu và phiên bản này vẫn được duy trì.
berramou avatar
lá cờ gb
Có, tôi có bản cập nhật này, đây là bản phát hành 3.X cuối cùng được cài đặt!
4uk4 avatar
lá cờ cn
Bạn có thể xác nhận cập nhật thành công không? Ví dụ: bằng cách kiểm tra xem các thẻ bộ đệm mà bạn đã thêm vào mẩu bánh mì có kết thúc trong phản hồi được lưu trong bộ nhớ cache hay không.
Điểm:0
lá cờ cn

Tôi không biết cách triển khai bộ nhớ đệm của các plugin trường GraphQL 3.x, nhưng theo như tôi có thể nói mã này (ngay cả sau cập nhật mới nhất từ năm 2018) không thu thập siêu dữ liệu breadcrumb vì nó chỉ nhận được các liên kết:

hàm được bảo vệ resolveValues($value, array $args, ResolveContext $context, ResolveInfo $info) {
    if ($value instanceof Url) {
      $resolve = $this->subRequestBuffer->add($value, function () {
        $links = $this->breadcrumbManager->build($this->routeMatch)->getLinks();
        trả lại liên kết $;
      });

      hàm trả về ($value, mảng $args, ResolveContext $context, ResolveInfo $info) sử dụng ($resolve) {
        /** @var \Drupal\graphql\GraphQL\Cache\CacheableValue $response */
        $response = $resolve();
        $links = $response->getValue();

        foreach ($liên kết dưới dạng $link) {
          mang lại CacheableValue mới($link, [$response]);
        }
      };
    }
  }

Nó có nên lấy đối tượng breadcrumb để thêm siêu dữ liệu có thể lưu vào bộ nhớ cache của nó không?

hàm được bảo vệ resolveValues($value, array $args, ResolveContext $context, ResolveInfo $info) {
    if ($value instanceof Url) {
      $resolve = $this->subRequestBuffer->add($value, function () {
        $breadcrumb = $this->breadcrumbManager->build($this->routeMatch);
        trả lại $breadcrumb;
      });

      hàm trả về ($value, mảng $args, ResolveContext $context, ResolveInfo $info) sử dụng ($resolve) {
        /** @var \Drupal\graphql\GraphQL\Cache\CacheableValue $response */
        $response = $resolve();
        $breadcrumb = $response->getValue();
        $links = $breadcrumb->getLinks();

        foreach ($liên kết dưới dạng $link) {
          mang lại CacheableValue mới($link, [$response, $breadcrumb]);
        }
      };
    }
  }

Đă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.