Display name * * This saves fetching the group from the backend for "just" the display name * @template-implements IEventListener */ class DisplayNameCache implements IEventListener { private CappedMemoryCache $cache; private ICache $memCache; private IGroupManager $groupManager; public function __construct(ICacheFactory $cacheFactory, IGroupManager $groupManager) { $this->cache = new CappedMemoryCache(); $this->memCache = $cacheFactory->createDistributed('groupDisplayNameMappingCache'); $this->groupManager = $groupManager; } public function getDisplayName(string $groupId): ?string { if (isset($this->cache[$groupId])) { return $this->cache[$groupId]; } $displayName = $this->memCache->get($groupId); if ($displayName) { $this->cache[$groupId] = $displayName; return $displayName; } $group = $this->groupManager->get($groupId); if ($group) { $displayName = $group->getDisplayName(); } else { $displayName = null; } $this->cache[$groupId] = $displayName; $this->memCache->set($groupId, $displayName, 60 * 10); // 10 minutes return $displayName; } public function clear(): void { $this->cache = new CappedMemoryCache(); $this->memCache->clear(); } public function handle(Event $event): void { if ($event instanceof GroupChangedEvent && $event->getFeature() === 'displayName') { $groupId = $event->getGroup()->getGID(); $newDisplayName = $event->getValue(); $this->cache[$groupId] = $newDisplayName; $this->memCache->set($groupId, $newDisplayName, 60 * 10); // 10 minutes } if ($event instanceof GroupDeletedEvent) { $groupId = $event->getGroup()->getGID(); unset($this->cache[$groupId]); $this->memCache->remove($groupId); } } }