ฉันมีตัวอย่างเช่น โหนด 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']);
}
}
}
}
บันทึก: เกล็ดขนมปังง่าย ติดตั้งโมดูลแล้ว