vendor/shopware/core/Framework/DataAbstractionLayer/Cache/InvalidateCacheSubscriber.php line 52

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Shopware\Core\Framework\DataAbstractionLayer\Cache;
  4. use Shopware\Core\Framework\Adapter\Cache\CacheClearer;
  5. use Shopware\Core\Framework\DataAbstractionLayer\Dbal\EntityDefinitionQueryHelper;
  6. use Shopware\Core\Framework\DataAbstractionLayer\DefinitionInstanceRegistry;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenContainerEvent;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenEvent;
  9. use Shopware\Core\Framework\DataAbstractionLayer\Field\FkField;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Field\StorageAware;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Field\TranslatedField;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. class InvalidateCacheSubscriber implements EventSubscriberInterface
  14. {
  15.     /**
  16.      * @var CacheClearer
  17.      */
  18.     private $cache;
  19.     /**
  20.      * @var EntityCacheKeyGenerator
  21.      */
  22.     private $cacheKeyGenerator;
  23.     /**
  24.      * @var DefinitionInstanceRegistry
  25.      */
  26.     private $definitionRegistry;
  27.     public function __construct(
  28.         CacheClearer $cache,
  29.         EntityCacheKeyGenerator $cacheKeyGenerator,
  30.         DefinitionInstanceRegistry $definitionRegistry
  31.     ) {
  32.         $this->cache $cache;
  33.         $this->cacheKeyGenerator $cacheKeyGenerator;
  34.         $this->definitionRegistry $definitionRegistry;
  35.     }
  36.     public static function getSubscribedEvents(): array
  37.     {
  38.         return [
  39.             EntityWrittenContainerEvent::class => [
  40.                 ['entitiesWritten', -20000],
  41.             ],
  42.         ];
  43.     }
  44.     public function entitiesWritten(EntityWrittenContainerEvent $event): void
  45.     {
  46.         $keys = [];
  47.         $events $event->getEvents();
  48.         if (!$events) {
  49.             return;
  50.         }
  51.         /** @var EntityWrittenEvent $writtenEvent */
  52.         foreach ($events as $writtenEvent) {
  53.             $definition $this->definitionRegistry->getByEntityName($writtenEvent->getEntityName());
  54.             foreach ($writtenEvent->getWriteResults() as $result) {
  55.                 $id $result->getPrimaryKey();
  56.                 if (\is_array($id)) {
  57.                     $id implode('-'$id);
  58.                 }
  59.                 $keys[] = $this->cacheKeyGenerator->getEntityTag($id$definition->getEntityName());
  60.                 foreach ($result->getPayload() as $propertyName => $value) {
  61.                     $field $definition->getFields()->get($propertyName);
  62.                     if (($field instanceof FkField) && $value !== null) {
  63.                         $keys[] = $this->cacheKeyGenerator->getEntityTag($value$field->getReferenceDefinition()->getEntityName());
  64.                     }
  65.                     if ($field instanceof TranslatedField) {
  66.                         $field EntityDefinitionQueryHelper::getTranslatedField($definition$field);
  67.                     }
  68.                     if (!$field instanceof StorageAware) {
  69.                         continue;
  70.                     }
  71.                     $keys[] = $this->cacheKeyGenerator->getFieldTag($definition$field->getStorageName());
  72.                 }
  73.             }
  74.         }
  75.         $keys array_filter(array_keys(array_flip($keys)));
  76.         $this->cache->invalidateTags($keys);
  77.     }
  78. }