У меня следующая ситуация: я хочу скрыть или показать некоторые локальные задачи (вкладки) на основе поля текущего пользователя.Поэтому я реализовал hook_menu_local_tasks_alter() in my_module/my_module.module
:
function my_module_menu_local_tasks_alter(&$data, $route_name, \Drupal\Core\Cache\RefinableCacheableDependencyInterface &$cacheability) {
... some logic ...
if ($user->get('field_my_field')->getValue() === 'some value')
unset($data['tabs'][0]['unwanted_tab_0']);
unset($data['tabs'][0]['unwanted_tab_1']);
... some logic ...
}
Это прекрасно работает, но мне нужно очистить кеш, если значение field_my_field
изменится.
Итак, я обнаружил, что мне нужнореализовать контекст Cache как это в моем my_module_menu_local_tasks_alter
:
$cacheability
->addCacheTags([
'user.available_regions',
]);
Я определил свой контекст Cache следующим образом:
my_module/my_module.services.yml
:
services:
cache_context.user.available_regions:
class: Drupal\my_module\CacheContext\AvailableRegions
arguments: ['@current_user']
tags:
- { name: cache.context }
my_module/src/CacheCotext/AvailableRegions.php:
<?php
namespace Drupal\content_sharing\CacheContext;
use Drupal\Core\Cache\CacheableMetadata;
use Drupal\Core\Cache\Context\CacheContextInterface;
use Drupal\Core\Session\AccountProxyInterface;
/**
* Class AvailableRegions.
*/
class AvailableRegions implements CacheContextInterface {
protected $currentUser;
/**
* Constructs a new DefaultCacheContext object.
*/
public function __construct(AccountProxyInterface $current_user) {
$this->currentUser = $current_user;
}
/**
* {@inheritdoc}
*/
public static function getLabel() {
return t('Available sub pages.');
}
/**
* {@inheritdoc}
*/
public function getContext() {
// Actual logic of context variation will lie here.
$field_published_sites = $this->get('field_published_sites')->getValue();
$sites = [];
foreach ($field_published_sites as $site) {
$sites[] = $site['target_id'];
}
return implode('|', $sites);
}
/**
* {@inheritdoc}
*/
public function getCacheableMetadata() {
return new CacheableMetadata();
}
}
Но каждый раз, когда я изменяю значение своего поля field_my_field
Мне все еще нужно очищать кеши, поэтому контекст не работает.Может ли кто-нибудь указать мне правильное направление, как решить эту проблему или как отладить такого рода Thigs?