<?php declare(strict_types=1);
namespace Swkweb\ProductSet\Core\Content\ProductSet\Cache;
use Shopware\Core\Content\Product\ProductDefinition;
use Shopware\Core\Framework\Adapter\Cache\CacheInvalidator;
use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenContainerEvent;
use Swkweb\ProductSet\Core\Content\ProductSet\Aggregate\ProductSetPriceCalculation\ProductSetPriceCalculationDefinition;
use Swkweb\ProductSet\Core\Content\ProductSet\ProductSetDefinition;
use Swkweb\ProductSet\Core\Content\ProductSet\SalesChannel\CachedProductSetRoute;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class CacheInvalidationSubscriber implements EventSubscriberInterface
{
private CacheInvalidator $cacheInvalidator;
public function __construct(CacheInvalidator $cacheInvalidator)
{
$this->cacheInvalidator = $cacheInvalidator;
}
public static function getSubscribedEvents(): array
{
return [
EntityWrittenContainerEvent::class => [
['invalidateProductSetRoute'],
['invalidateProductSetIds'],
['invalidatePriceCalculationIds'],
],
];
}
public function invalidateProductSetRoute(EntityWrittenContainerEvent $event): void
{
$ids = $event->getPrimaryKeys(ProductDefinition::ENTITY_NAME);
if (count($ids) === 0) {
return;
}
$this->cacheInvalidator->invalidate(array_map(fn (string $id) => CachedProductSetRoute::buildName($id), $ids));
}
public function invalidateProductSetIds(EntityWrittenContainerEvent $event): void
{
$ids = $event->getPrimaryKeys(ProductSetDefinition::ENTITY_NAME);
if (count($ids) === 0) {
return;
}
$this->cacheInvalidator->invalidate(array_map(fn (string $id) => ProductSetCacheKeyGenerator::buildSetTag($id), $ids));
}
public function invalidatePriceCalculationIds(EntityWrittenContainerEvent $event): void
{
$ids = $event->getPrimaryKeys(ProductSetPriceCalculationDefinition::ENTITY_NAME);
if (count($ids) === 0) {
return;
}
$this->cacheInvalidator->invalidate(array_map(fn (string $id) => ProductSetCacheKeyGenerator::buildPriceCalculationTag($id), $ids));
}
}