tôi có ví dụ nút A với bí danh nút-a và nú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ử:
- 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!
- 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
- 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.