farm-2.x-dev/modules/core/asset/src/AssetStorage.php
modules/core/asset/src/AssetStorage.php
<?php
namespace Drupal\asset;
use Drupal\Component\Datetime\TimeInterface;
use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\Cache\MemoryCache\MemoryCacheInterface;
use Drupal\Core\Database\Connection;
use Drupal\Core\Entity\EntityFieldManagerInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Entity\Sql\SqlContentEntityStorage;
use Drupal\Core\Language\LanguageManagerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Defines the controller class for assets.
*
* This extends the base storage class, adding required special handling for
* asset entities.
*/
class AssetStorage extends SqlContentEntityStorage {
/**
* The time service.
*
* @var \Drupal\Component\Datetime\TimeInterface
*/
protected $time;
/**
* Constructs an AssetStorage object.
*
* @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
* The entity type definition.
* @param \Drupal\Core\Database\Connection $database
* The database connection to be used.
* @param \Drupal\Core\Entity\EntityFieldManagerInterface $entity_field_manager
* The entity field manager.
* @param \Drupal\Core\Cache\CacheBackendInterface $cache
* The cache backend to be used.
* @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
* The language manager.
* @param \Drupal\Core\Cache\MemoryCache\MemoryCacheInterface $memory_cache
* The memory cache backend to be used.
* @param \Drupal\Core\Entity\EntityTypeBundleInfoInterface $entity_type_bundle_info
* The entity type bundle info.
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
* The entity type manager.
* @param \Drupal\Component\Datetime\TimeInterface $time
* The time service.
*/
public function __construct(EntityTypeInterface $entity_type, Connection $database, EntityFieldManagerInterface $entity_field_manager, CacheBackendInterface $cache, LanguageManagerInterface $language_manager, MemoryCacheInterface $memory_cache, EntityTypeBundleInfoInterface $entity_type_bundle_info, EntityTypeManagerInterface $entity_type_manager, TimeInterface $time) {
parent::__construct($entity_type, $database, $entity_field_manager, $cache, $language_manager, $memory_cache, $entity_type_bundle_info, $entity_type_manager);
$this->time = $time;
}
/**
* {@inheritdoc}
*/
public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) {
return new static(
$entity_type,
$container->get('database'),
$container->get('entity_field.manager'),
$container->get('cache.entity'),
$container->get('language_manager'),
$container->get('entity.memory_cache'),
$container->get('entity_type.bundle.info'),
$container->get('entity_type.manager'),
$container->get('datetime.time'),
);
}
/**
* {@inheritdoc}
*/
protected function doPreSave(EntityInterface $entity) {
/** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
$id = parent::doPreSave($entity);
// If there is no original entity, bail.
if (empty($entity->original)) {
return $id;
}
// Load new and original states.
$new_state = $entity->get('status')->first()->getString();
$old_state = $entity->original->get('status')->first()->getString();
$state_unchanged = $new_state == $old_state;
// If the entity is not archived and this would otherwise not be a state
// transition but the archive timestamp is set, then transition to the
// archived state.
if ($state_unchanged && $old_state != 'archived' && $entity->getArchivedTime() != NULL) {
$entity->get('status')->first()->applyTransitionById('archive');
}
// If the entity is archived and this would otherwise not be a state
// transition but the archive timestemp is NULL, then transition to the
// active state.
if ($state_unchanged && $old_state == 'archived' && $entity->getArchivedTime() == NULL) {
$entity->get('status')->first()->applyTransitionById('to_active');
}
// If the state has not changed, bail.
if ($state_unchanged) {
return $id;
}
// If the state has changed to archived and no archived timestamp was
// specified, set it to the current time.
if ($new_state == 'archived' && $entity->getArchivedTime() == NULL) {
$entity->setArchivedTime($this->time->getRequestTime());
}
// Or, if the state has changed from archived, set a null value.
elseif ($old_state == 'archived') {
$entity->setArchivedTime(NULL);
}
return $id;
}
}
