custom/plugins/PixelLexikonSW6/src/Controller/StoreApi/CacheInvalidationSubscriber.php line 36

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Pixel\LexikonSW6\Controller\StoreApi;
  3. use Pixel\LexikonSW6\Controller\StoreApi\LexikonCategories\CachedLexikonCatRoute;
  4. use Pixel\LexikonSW6\Entities\Categories\LexikonCategoriesDefinition;
  5. use Shopware\Core\Content\Cms\Aggregate\CmsSlotTranslation\CmsSlotTranslationDefinition;
  6. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenContainerEvent;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  9. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  10. use Shopware\Core\Framework\Adapter\Cache\CacheInvalidator;
  11. class CacheInvalidationSubscriber implements EventSubscriberInterface
  12. {
  13.     private CacheInvalidator $cacheInvalidator;
  14.     private $cmsRepository;
  15.     public function __construct(CacheInvalidator $cacheInvalidatorEntityRepositoryInterface $cmsRepository)
  16.     {
  17.         $this->cacheInvalidator $cacheInvalidator;
  18.         $this->cmsRepository $cmsRepository;
  19.     }
  20.     public static function getSubscribedEvents()
  21.     {
  22.         // docs : https://developer.shopware.com/docs/guides/plugins/plugins/framework/store-api/add-caching-for-store-api-route
  23.         // The EntityWrittenContainerEvent is a generic event that is always thrown when an entities are written. This contains all changed entities
  24.         return [
  25.             EntityWrittenContainerEvent::class => [
  26.                 ['invalidate'2001]
  27.             ]
  28.         ];
  29.     }
  30.     public function invalidate(EntityWrittenContainerEvent $event): void
  31.     {
  32.         // check if cagegory written.
  33.         $changesCategory $event->getPrimaryKeys('category');
  34.         // check if own entity written. In some cases you want to use the primary keys for further cache invalidation
  35.         $changesLexikonCats $event->getPrimaryKeys(LexikonCategoriesDefinition::ENTITY_NAME);
  36.         // check if cms slots written.
  37.         $changesCmsData $event->getPrimaryKeys(CmsSlotTranslationDefinition::ENTITY_NAME);
  38.         $InvalidateLexikon false;
  39.         if (!empty($changesCategory)) {
  40.             $LexikonRoutes = [];
  41.             foreach ($changesCategory as $catsId) {
  42.                 $LexikonRoutes[] = CachedLexikonCatRoute::buildName($catsId);
  43.             }
  44.             $this->cacheInvalidator->invalidate($LexikonRoutes);
  45.         }
  46.         if (!empty($changesLexikonCats)) {
  47.             $LexikonDataRoutes = [];
  48.             foreach ($changesLexikonCats as $catId) {
  49.                 $LexikonDataRoutes[] = CachedLexikonCatRoute::buildName($catId);
  50.             }
  51.             $this->cacheInvalidator->invalidate($LexikonDataRoutes);
  52.             $InvalidateLexikon true;
  53.         }
  54.         if (!empty($changesCmsData)) {
  55.             $cmsSlotsIds array_map(function ($cmsitem) {
  56.                 if (is_array($cmsitem) && array_key_exists('cmsSlotId'$cmsitem)) {
  57.                     return $cmsitem['cmsSlotId'];
  58.                 }
  59.                 return $cmsitem;
  60.             }, $changesCmsData);
  61.             if (!empty($cmsSlotsIds)) {
  62.                 $criteriaCms = new Criteria($cmsSlotsIds);
  63.                 $slots $this->cmsRepository->search($criteriaCms$event->getContext())->getEntities();
  64.                 foreach ($slots as $slot) {
  65.                     if ($slot->getType() == 'lexikon-categories') {
  66.                         $InvalidateLexikon true;
  67.                         break;
  68.                     }
  69.                 }
  70.             }
  71.         }
  72.         if ($InvalidateLexikon) {
  73.             $this->cacheInvalidator->invalidate([
  74.                 CachedLexikonCatRoute::buildName('')
  75.             ]);
  76.         }
  77.     }
  78. }