custom/plugins/Neon6Configurator/src/Subscribers/CacheInvalidatorSubscriber.php line 44

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Neon\Configurator\Subscribers;
  3. use Doctrine\DBAL\Connection;
  4. use Neon\Configurator\Core\Content\Configuration\ConfigurationDefinition;
  5. use Shopware\Core\Content\Product\Aggregate\ProductCategory\ProductCategoryDefinition;
  6. use Shopware\Core\Content\Product\SalesChannel\Detail\CachedProductDetailRoute;
  7. use Shopware\Core\Defaults;
  8. use Shopware\Core\Framework\Adapter\Cache\CacheInvalidator;
  9. use Shopware\Core\Framework\DataAbstractionLayer\Cache\EntityCacheKeyGenerator;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenContainerEvent;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenEvent;
  12. use Shopware\Core\Framework\Uuid\Uuid;
  13. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  14. /**
  15.  * @internal - The functions inside this class are no public-api and can be changed without previous deprecation
  16.  */
  17. class CacheInvalidatorSubscriber implements EventSubscriberInterface
  18. {
  19.     private Connection $connection;
  20.     private CacheInvalidator $cacheInvalidator;
  21.     public function __construct(
  22.         CacheInvalidator $cacheInvalidator,
  23.         Connection       $connection
  24.     )
  25.     {
  26.         $this->cacheInvalidator $cacheInvalidator;
  27.         $this->connection $connection;
  28.     }
  29.     public static function getSubscribedEvents()
  30.     {
  31.         return [
  32.             EntityWrittenContainerEvent::class => [
  33.                 ['invalidateProductConfigurationAssignment'2006]
  34.             ],
  35.         ];
  36.     }
  37.     public function invalidateProductConfigurationAssignment(EntityWrittenContainerEvent $event): void
  38.     {
  39.         //invalidates the product listing route, each time a product - category assignment changed
  40.         $ids $event->getPrimaryKeys(ConfigurationDefinition::ENTITY_NAME);
  41.         $productIds = [];
  42.         foreach ($ids as $configurationId) {
  43.             $productId $this->connection->fetchFirstColumn(
  44.                 'SELECT product_id FROM product_translation WHERE JSON_EXTRACT(custom_fields, "$.neon_configurator_products_config") = :configurationId;',
  45.                 ['configurationId' => $configurationId]
  46.             );
  47.             if ($productId != null) {
  48.                 $productIds[] = Uuid::fromBytesToHex($productId[0]);
  49.             }
  50.         }
  51.         if (count($productIds) > 0) {
  52.             $this->cacheInvalidator->invalidate(
  53.                 array_map([CachedProductDetailRoute::class, 'buildName'], array_unique($productIds)),
  54.             );
  55.         }
  56.     }
  57. }