diff --git a/src/Event/Subscriber/ContentSaveSubscriber.php b/src/Event/Subscriber/ContentSaveSubscriber.php index d22533930..97f93bbb2 100644 --- a/src/Event/Subscriber/ContentSaveSubscriber.php +++ b/src/Event/Subscriber/ContentSaveSubscriber.php @@ -4,11 +4,10 @@ namespace Bolt\Event\Subscriber; -use Bolt\Configuration\Config; use Bolt\Event\ContentEvent; use Bolt\Log\LoggerTrait; use Symfony\Component\EventDispatcher\EventSubscriberInterface; -use Symfony\Contracts\Cache\CacheInterface; +use Symfony\Contracts\Cache\TagAwareCacheInterface; class ContentSaveSubscriber implements EventSubscriberInterface { @@ -16,26 +15,18 @@ class ContentSaveSubscriber implements EventSubscriberInterface public const PRIORITY = 100; - /** @var CacheInterface */ + /** @var TagAwareCacheInterface */ private $cache; - /** @var Config */ - private $config; - - public function __construct(CacheInterface $cache, Config $config) + public function __construct(TagAwareCacheInterface $cache) { $this->cache = $cache; - $this->config = $config; } public function postSave(ContentEvent $event): ContentEvent { // Make sure we flush the cache for the menu's - $menus = $this->config->get('menu')->keys()->all(); - foreach ($menus as $menu) { - $this->cache->delete('frontendmenu_' . $menu); - } - $this->cache->delete('backendmenu'); + $this->cache->invalidateTags(['backendmenu', 'frontendmenu']); // Saving an entry in the log. $context = [ diff --git a/src/Menu/CachedBackendMenuBuilder.php b/src/Menu/CachedBackendMenuBuilder.php index 9ce870869..7ab6e388c 100644 --- a/src/Menu/CachedBackendMenuBuilder.php +++ b/src/Menu/CachedBackendMenuBuilder.php @@ -6,6 +6,8 @@ use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Contracts\Cache\CacheInterface; +use Symfony\Contracts\Cache\ItemInterface; +use Symfony\Contracts\Cache\TagAwareCacheInterface; final class CachedBackendMenuBuilder implements BackendMenuBuilderInterface { @@ -18,7 +20,7 @@ final class CachedBackendMenuBuilder implements BackendMenuBuilderInterface /** @var RequestStack */ private $requestStack; - public function __construct(BackendMenuBuilderInterface $menuBuilder, CacheInterface $cache, RequestStack $requestStack) + public function __construct(BackendMenuBuilderInterface $menuBuilder, TagAwareCacheInterface $cache, RequestStack $requestStack) { $this->cache = $cache; $this->menuBuilder = $menuBuilder; @@ -29,7 +31,9 @@ public function buildAdminMenu(): array { $locale = $this->requestStack->getCurrentRequest()->getLocale(); $cacheKey = 'backendmenu_' . $locale; - return $this->cache->get($cacheKey, function () { + return $this->cache->get($cacheKey, function (ItemInterface $item) { + $item->tag('backendmenu'); + return $this->menuBuilder->buildAdminMenu(); }); } diff --git a/src/Menu/CachedFrontendMenuBuilder.php b/src/Menu/CachedFrontendMenuBuilder.php index c7a58189c..53fa67491 100644 --- a/src/Menu/CachedFrontendMenuBuilder.php +++ b/src/Menu/CachedFrontendMenuBuilder.php @@ -4,27 +4,36 @@ namespace Bolt\Menu; -use Symfony\Contracts\Cache\CacheInterface; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\RequestStack; +use Symfony\Contracts\Cache\ItemInterface; +use Symfony\Contracts\Cache\TagAwareCacheInterface; final class CachedFrontendMenuBuilder implements FrontendMenuBuilderInterface { - /** @var CacheInterface */ + /** @var TagAwareCacheInterface */ private $cache; /** @var FrontendMenuBuilderInterface */ private $menuBuilder; - public function __construct(FrontendMenuBuilderInterface $menuBuilder, CacheInterface $cache) + /** @var Request */ + private $request; + + public function __construct(FrontendMenuBuilderInterface $menuBuilder, TagAwareCacheInterface $cache, RequestStack $requestStack) { $this->cache = $cache; $this->menuBuilder = $menuBuilder; + $this->request = $requestStack->getCurrentRequest(); } public function buildMenu(?string $name = null): array { - $key = 'frontendmenu_' . ($name ?: 'main'); + $key = 'frontendmenu_' . ($name ?: 'main') . '_' . $this->request->getLocale(); + + return $this->cache->get($key, function (ItemInterface $item) use ($name) { + $item->tag('frontendmenu'); - return $this->cache->get($key, function () use ($name) { return $this->menuBuilder->buildMenu($name); }); }