ฉันมีตัวอย่างเช่น โหนด A ด้วยนามแฝง โหนด-ก และ โหนด B ด้วยนามแฝง โหนด-a/node-b ของฉัน โหนด B ฉันมีเกล็ดขนมปังนี้ หน้าแรก > โหนด A > โหนด B
ผลลัพธ์ GraphQl:
"เกล็ดขนมปัง": [
                {
                    "ข้อความ": "หน้าแรก",
                    "url": {
                        "เส้นทาง": "/",
                        "กำหนดเส้นทาง": จริง
                    }
                },
                {
                    "ข้อความ": "โหนด A",
                    "url": {
                        "เส้นทาง": "http://example.com/node-a",
                        "กำหนดเส้นทาง": จริง
                    }
                },
                {
                    "ข้อความ": "โหนด B",
                    "url": {
                        "เส้นทาง": "",
                        "กำหนดเส้นทาง": จริง
                    }
                }
            ]
แต่เมื่อฉันเปลี่ยนไป โหนด A ชื่อ ฉันได้รับผลลัพธ์เหมือนเดิมเสมอ (breadcrumbs ไม่เปลี่ยนแปลง) แต่เมื่อฉันบันทึกใหม่ โหนด A หรือล้างแคชการเปลี่ยนแปลงผลลัพธ์ของ graphQl
นี่คือสิ่งที่ฉันได้ลอง:
- ล้างแคชของ graphQl (ผลลัพธ์และคำจำกัดความ) ในการอัปเดตโหนด:
 
     /**
     * ใช้ hook_ENTITY_TYPE_update()
     */
    ฟังก์ชัน MYMODULE_node_update (EntityInterface $entity) {
      // ล้างแคชของ 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();
    }
มันไม่ทำงาน !
- ล้างแคชของโหนดลูกทั้งหมดในการอัปเดตโหนดดังนี้:
 
    /**
     * ใช้ hook_ENTITY_TYPE_update()
     */
    ฟังก์ชัน MYMODULE_node_update (EntityInterface $entity) {
      $database = \Drupal::database();
      // รับนามแฝงเส้นทางโหนดปัจจุบัน
      $alias = \Drupal::service('path_alias.manager')
        ->getAliasByPath('/node/' . $entity->id());
      // รับโหนดลูกทั้งหมดของโหนดปัจจุบัน
      $child_nodes_alias = $database->select('path_alias', 'pa')->fields('pa', [
        'เส้นทาง',
        'นามแฝง',
      ])->เงื่อนไข ('เส้นทาง', '/โหนด/%', 'ชอบ')
        ->เงื่อนไข('นามแฝง', $นามแฝง '%', 'ชอบ')
        ->ดำเนินการ ()
        ->ดึงข้อมูลทั้งหมด ();
      // ทำให้แคชใช้ไม่ได้สำหรับแต่ละโหนดย่อยของโหนดปัจจุบัน
      foreach ($child_nodes_alias เป็น $alias_data) {
        $nid = ระเบิด ('/', $alias_data->เส้นทาง)[2] ?? โมฆะ;
        ถ้า ($nid && $nid != $entity->id()) {
          $tags = ['โหนด:' $นิด];
          แคช::invalidateTags($tags);
          \Drupal::entityTypeManager()->getStorage('node')->resetCache([$nid]);
        }
      }
    }
มันใช้งานไม่ได้เช่นกัน
- ฉันรวมสองวิธีก่อนหน้านี้เข้าด้วยกันก็ไม่ได้ผลเช่นกัน
 
เมื่อฉันล้างแคชทั้งหมดในการอัปเดตโหนด มันใช้งานได้ แต่ไม่ใช่วิธีที่ดีที่สุดที่จะส่งผลกระทบต่อแคชของไซต์
/**
 * ใช้ hook_ENTITY_TYPE_update()
 */
ฟังก์ชัน MYMODULE_node_update (EntityInterface $entity) {
  drupal_flush_all_caches();
}
วิธีที่ดีที่สุดในการล้างแคชเบรดครัมบ์หรือโหนดย่อยโดยไม่ต้องล้างแคชของไซต์ทั้งหมดคืออะไร
แก้ไข:
ขอขอบคุณ @4K4 สำหรับความคิดเห็นของคุณ ฉันพยายามเพิ่ม CacheTags ด้วย breadcrumb แต่ก็ไม่ได้ผลเช่นกัน !
/**
 * ใช้ hook_system_breadcrumb_alter()
 */
ฟังก์ชัน MYMODULE_system_breadcrumb_alter (Breadcrumb & $breadcrumb, RouteMatchInterface $route_match, อาร์เรย์ $context) {
  // ต่อท้ายชื่อเพจปัจจุบันใน breadcrumb สำหรับเส้นทางที่ไม่ใช่ผู้ดูแลระบบ
  ถ้า ($breadcrumb && !\Drupal::service('router.admin_context')->isAdminRoute()) {
    $links = $breadcrumb->getLinks();
    foreach (ลิงก์ $ เป็น $ ลิงก์) {
      $parameters = $link->getUrl()->getRouteParameters();
      ถ้า ($ พารามิเตอร์) {
        // ตรวจสอบให้แน่ใจว่า breadcrumb ได้รับการอัปเดตเมื่อชื่อโหนดเปลี่ยนแปลง
        $breadcrumb->addCacheTags(['node:' . $parameters['node']]);
        $breadcrumb->addCacheContexts(['url']);
      }
    }
  }
}
บันทึก: เกล็ดขนมปังง่าย ติดตั้งโมดูลแล้ว