tome-8.x-1.x-dev/modules/tome_sync/modules/tome_sync_autoclean/src/EventSubscriber/ExportEventSubscriber.php

modules/tome_sync/modules/tome_sync_autoclean/src/EventSubscriber/ExportEventSubscriber.php
<?php

namespace Drupal\tome_sync_autoclean\EventSubscriber;

use Drupal\Core\Config\ConfigCrudEvent;
use Drupal\Core\Config\ConfigEvents;
use Drupal\Core\Config\StorageInterface;
use Drupal\Core\File\FileSystemInterface;
use Drupal\tome_base\PathTrait;
use Drupal\tome_sync\CleanFilesTrait;
use Drupal\tome_sync\ContentIndexerTrait;
use Drupal\tome_sync\Event\ContentCrudEvent;
use Drupal\tome_sync\Event\TomeSyncEvents;
use Drupal\tome_sync\FileSyncInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Automatically deletes unused files after content/config is exported.
 *
 * @internal
 */
class ExportEventSubscriber implements EventSubscriberInterface {

  use PathTrait;
  use ContentIndexerTrait;
  use CleanFilesTrait;

  /**
   * The target content storage.
   *
   * @var \Drupal\Core\Config\StorageInterface
   */
  protected $contentStorage;

  /**
   * The config storage.
   *
   * @var \Drupal\Core\Config\StorageInterface
   */
  protected $configStorage;

  /**
   * The file system.
   *
   * @var \Drupal\Core\File\FileSystemInterface
   */
  protected $fileSystem;

  /**
   * The file sync service.
   *
   * @var \Drupal\tome_sync\FileSyncInterface
   */
  protected $fileSync;

  /**
   * Creates a ExportEventSubscriber object.
   *
   * @param \Drupal\Core\Config\StorageInterface $content_storage
   *   The target content storage.
   * @param \Drupal\Core\Config\StorageInterface $config_storage
   *   The target config storage.
   * @param \Drupal\tome_sync\FileSyncInterface $file_sync
   *   The file sync service.
   * @param \Drupal\Core\File\FileSystemInterface $file_system
   *   The file system.
   */
  public function __construct(StorageInterface $content_storage, StorageInterface $config_storage, FileSyncInterface $file_sync, FileSystemInterface $file_system) {
    $this->contentStorage = $content_storage;
    $this->configStorage = $config_storage;
    $this->fileSync = $file_sync;
    $this->fileSystem = $file_system;
  }

  /**
   * Removes unused files.
   */
  protected function deleteUnusedFiles() {
    $files = $this->getUnusedFiles();
    foreach ($files as $uuid => $filename) {
      $this->contentStorage->delete("file.$uuid");
      $this->unIndexContentByName("file.$uuid");
      $this->fileSync->deleteFile($filename);
    }
  }

  /**
   * Reacts to content events.
   *
   * @param \Drupal\tome_sync\Event\ContentCrudEvent $event
   *   The event.
   */
  public function exportContent(ContentCrudEvent $event) {
    if ($event->getContent()->getEntityTypeId() === 'file') {
      return;
    }
    $has_file_field = FALSE;
    foreach ($event->getContent()->getFieldDefinitions() as $definition) {
      if (in_array($definition->getType(), ['file', 'image'], TRUE)) {
        $has_file_field = TRUE;
        break;
      }
    }
    if ($has_file_field) {
      $this->deleteUnusedFiles();
    }
  }

  /**
   * Reacts to config events.
   *
   * @param \Drupal\Core\Config\ConfigCrudEvent $event
   *   The event.
   */
  public function exportConfig(ConfigCrudEvent $event) {
    if (!\Drupal::isConfigSyncing() && !isset($GLOBALS['_tome_sync_installing'])) {
      $this->deleteUnusedFiles();
    }
  }

  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents() {
    $events[TomeSyncEvents::EXPORT_CONTENT][] = ['exportContent', -1];
    $events[TomeSyncEvents::DELETE_CONTENT][] = ['exportContent', -1];
    $events[ConfigEvents::SAVE][] = ['exportConfig', -1];
    $events[ConfigEvents::DELETE][] = ['exportConfig', -1];
    return $events;
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc