diff --git a/flysystem.services.yml b/flysystem.services.yml index af36b1a..3441c8b 100644 --- a/flysystem.services.yml +++ b/flysystem.services.yml @@ -20,7 +20,7 @@ services: flysystem_image_style_copier: class: Drupal\flysystem\ImageStyleCopier - arguments: ['@lock', '@file_system', '@logger.channel.image'] + arguments: ['@lock', '@file_system', '@logger.channel.image', '@entity_type.manager', '@cache_tags.invalidator'] tags: - { name: event_subscriber } diff --git a/src/ImageStyleCopier.php b/src/ImageStyleCopier.php index 102daaf..b657250 100644 --- a/src/ImageStyleCopier.php +++ b/src/ImageStyleCopier.php @@ -3,12 +3,12 @@ namespace Drupal\flysystem; use Drupal\Component\Utility\Crypt; -use Drupal\Core\DependencyInjection\ContainerInjectionInterface; +use Drupal\Core\Cache\CacheTagsInvalidatorInterface; +use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\File\FileSystemInterface; use Drupal\Core\Lock\LockBackendInterface; use Drupal\image\ImageStyleInterface; use Psr\Log\LoggerInterface; -use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpKernel\KernelEvents; @@ -18,14 +18,28 @@ use Symfony\Component\HttpKernel\KernelEvents; * This class is registered to run on the kernel's terminate event so it doesn't * block image delivery. */ -class ImageStyleCopier implements EventSubscriberInterface, ContainerInjectionInterface { +class ImageStyleCopier implements EventSubscriberInterface { /** - * The lock backend interface. + * The cache tags invalidator. * - * @var \Drupal\Core\Lock\LockBackendInterface + * @var \Drupal\Core\Cache\CacheTagsInvalidatorInterface */ - protected $lock; + protected $cacheTagsInvalidator; + + /** + * An array of image derivatives to copy. + * + * @var array + */ + protected $copyTasks = []; + + /** + * The entity type manager. + * + * @var \Drupal\Core\Entity\EntityTypeManagerInterface + */ + protected $entityTypeManager; /** * The file system. @@ -35,18 +49,18 @@ class ImageStyleCopier implements EventSubscriberInterface, ContainerInjectionIn protected $fileSystem; /** - * The system logger. + * The lock backend interface. * - * @var \Psr\Log\LoggerInterface + * @var \Drupal\Core\Lock\LockBackendInterface */ - protected $logger; + protected $lock; /** - * An array of image derivatives to copy. + * The system logger. * - * @var array + * @var \Psr\Log\LoggerInterface */ - protected $copyTasks = []; + protected $logger; /** * Constructs an ImageStyleCopier. @@ -58,21 +72,16 @@ class ImageStyleCopier implements EventSubscriberInterface, ContainerInjectionIn * @param \Psr\Log\LoggerInterface $logger * The system logger. */ - public function __construct(LockBackendInterface $lock, FileSystemInterface $file_system, LoggerInterface $logger) { + public function __construct(LockBackendInterface $lock, + FileSystemInterface $file_system, + LoggerInterface $logger, + EntityTypeManagerInterface $entity_type_manager, + CacheTagsInvalidatorInterface $cache_tags_invalidator) { $this->lock = $lock; $this->fileSystem = $file_system; $this->logger = $logger; - } - - /** - * {@inheritdoc} - */ - public static function create(ContainerInterface $container) { - return new static( - $container->get('lock'), - $container->get('file_system'), - $container->get('logger.channel.image') - ); + $this->entityTypeManager = $entity_type_manager; + $this->cacheTagsInvalidator = $cache_tags_invalidator; } /** @@ -153,8 +162,26 @@ class ImageStyleCopier implements EventSubscriberInterface, ContainerInjectionIn } finally { file_unmanaged_delete($temporary_uri); + $this->invalidateTags($source_uri); $this->lock->release($lock_name); } } + /** + * Invalidates the cache tags for a file URI. + * + * @param string $uri + * The file URI. + */ + protected function invalidateTags($uri) { + $file = $this->entityTypeManager + ->getStorage('file') + ->loadByProperties(['uri' => $uri]); + + if ($file) { + $file = reset($file); + $this->cacheTagsInvalidator->invalidateTags($file->getCacheTagsToInvalidate()); + } + } + }