Commit 055aac10 authored by alexpott's avatar alexpott

Issue #2332577 by Berdir: Remove EntityDatabaseStorage.

parent e4750a75
<?php
/**
* @file
* Contains \Drupal\Core\Entity\EntityDatabaseStorage.
*/
namespace Drupal\Core\Entity;
use Drupal\Component\Uuid\UuidInterface;
use Drupal\Core\Database\Connection;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Defines a base entity storage class.
*
* This class only supports bare, non-content entities.
*/
class EntityDatabaseStorage extends EntityStorageBase {
/**
* The UUID service.
*
* @var \Drupal\Component\Uuid\UuidInterface
*/
protected $uuidService;
/**
* Whether this entity type should use the static cache.
*
* @var boolean
*/
protected $cache;
/**
* Active database connection.
*
* @var \Drupal\Core\Database\Connection
*/
protected $database;
/**
* {@inheritdoc}
*/
public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) {
return new static(
$entity_type,
$container->get('database'),
$container->get('uuid')
);
}
/**
* Constructs a EntityDatabaseStorage 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\Component\Uuid\UuidInterface $uuid_service
* The UUID service.
*/
public function __construct(EntityTypeInterface $entity_type, Connection $database, UuidInterface $uuid_service) {
parent::__construct($entity_type);
$this->database = $database;
$this->uuidService = $uuid_service;
// Check if the entity type supports UUIDs.
$this->uuidKey = $this->entityType->getKey('uuid');
}
/**
* {@inheritdoc}
*/
protected function doLoadMultiple(array $ids = NULL) {
// Build and execute the query.
$records = $this
->buildQuery($ids)
->execute()
->fetchAllAssoc($this->idKey, \PDO::FETCH_ASSOC);
return $this->mapFromStorageRecords($records);
}
/**
* {@inheritdoc}
*/
public function loadRevision($revision_id) {
throw new \Exception('Database storage does not support revisions.');
}
/**
* {@inheritdoc}
*/
public function deleteRevision($revision_id) {
throw new \Exception('Database storage does not support revisions.');
}
/**
* Builds the query to load the entity.
*
* @param array|null $ids
* An array of entity IDs, or NULL to load all entities.
*
* @return \Drupal\Core\Database\Query\Select
* A SelectQuery object for loading the entity.
*/
protected function buildQuery($ids) {
$query = $this->database->select($this->entityType->getBaseTable(), 'base');
$query->addTag($this->entityTypeId . '_load_multiple');
// Add fields from the {entity} table.
$entity_fields = drupal_schema_fields_sql($this->entityType->getBaseTable());
$query->fields('base', $entity_fields);
if ($ids) {
$query->condition("base.{$this->idKey}", $ids, 'IN');
}
return $query;
}
/**
* {@inheritdoc}
*/
public function delete(array $entities) {
if (!$entities) {
// If no IDs or invalid IDs were passed, do nothing.
return;
}
$transaction = $this->database->startTransaction();
try {
parent::delete($entities);
// Ignore replica server temporarily.
db_ignore_replica();
}
catch (\Exception $e) {
$transaction->rollback();
watchdog_exception($this->entityTypeId, $e);
throw new EntityStorageException($e->getMessage(), $e->getCode(), $e);
}
}
/**
* {@inheritdoc}
*/
protected function doDelete($entities) {
$ids = array_keys($entities);
$this->database->delete($this->entityType->getBaseTable())
->condition($this->idKey, $ids, 'IN')
->execute();
// Reset the cache as soon as the changes have been applied.
$this->resetCache($ids);
}
/**
* {@inheritdoc}
*/
public function save(EntityInterface $entity) {
$transaction = $this->database->startTransaction();
try {
$return = parent::save($entity);
// Ignore replica server temporarily.
db_ignore_replica();
return $return;
}
catch (\Exception $e) {
$transaction->rollback();
watchdog_exception($this->entityTypeId, $e);
throw new EntityStorageException($e->getMessage(), $e->getCode(), $e);
}
}
/**
* {@inheritdoc}
*/
protected function doSave($id, EntityInterface $entity) {
if (!$entity->isNew()) {
$return = drupal_write_record($this->entityType->getBaseTable(), $entity, $this->idKey);
$this->resetCache(array($entity->id()));
}
else {
$return = drupal_write_record($this->entityType->getBaseTable(), $entity);
// Reset general caches, but keep caches specific to certain entities.
$this->resetCache(array());
}
return $return;
}
/**
* {@inheritdoc}
*/
protected function has($id, EntityInterface $entity) {
return !$entity->isNew();
}
/**
* {@inheritdoc}
*/
public function getQueryServiceName() {
return 'entity.query.sql';
}
}
......@@ -7,3 +7,4 @@ core: 8.x
dependencies:
- field_ui
- entity_test
......@@ -7,27 +7,21 @@
namespace Drupal\field_ui_test\Entity;
use Drupal\Core\Entity\Entity;
use Drupal\entity_test\Entity\EntityTest;
/**
* Defines the test Field UI class.
*
* @EntityType(
* @ContentEntityType(
* id = "field_ui_test_no_bundle",
* label = @Translation("Test Field UI entity, no bundle"),
* handlers = {
* "storage" = "Drupal\Core\Entity\EntityDatabaseStorage"
* entity_keys = {
* "id" = "id",
* "uuid" = "uuid",
* },
* fieldable = TRUE
* )
*/
class FieldUITestNoBundle extends Entity {
/**
* The entity ID.
*
* @var int
*/
public $id;
class FieldUITestNoBundle extends EntityTest {
}
<?php
/**
* @file
* Definition of Drupal\system\Tests\Entity\EntityApiInfoTest.
*/
namespace Drupal\system\Tests\Entity;
use Drupal\simpletest\WebTestBase;
/**
* Makes sure entity info is accurately cached.
*
* @group Entity
*/
class EntityApiInfoTest extends WebTestBase {
/**
* Ensures entity info cache is updated after changes.
*/
function testEntityInfoChanges() {
\Drupal::moduleHandler()->install(array('entity_cache_test'));
$entity_types = \Drupal::entityManager()->getDefinitions();
$this->assertTrue(isset($entity_types['entity_cache_test']), 'Test entity type found.');
// Change the label of the test entity type and make sure changes appear
// after flushing caches.
\Drupal::state()->set('entity_cache_test.label', 'New label.');
$entity_type = \Drupal::entityManager()->getDefinition('entity_cache_test');
$this->assertEqual($entity_type->getLabel(), 'Entity Cache Test', 'Original label appears in cached entity info.');
$this->resetAll();
$entity_type = \Drupal::entityManager()->getDefinition('entity_cache_test');
$this->assertEqual($entity_type->getLabel(), 'New label.', 'New label appears in entity info.');
// Uninstall the providing module and make sure the entity type is gone.
$this->container->get('module_handler')->uninstall(array('entity_cache_test', 'entity_cache_test_dependency'));
$entity_types = \Drupal::entityManager()->getDefinitions();
$this->assertFalse(isset($entity_types['entity_cache_test']), 'Entity type of the providing module is gone.');
}
/**
* Tests entity info cache after enabling a module with a dependency on an entity providing module.
*
* @see entity_cache_test_modules_enabled()
*/
function testEntityInfoCacheModulesEnabled() {
\Drupal::moduleHandler()->install(array('entity_cache_test'));
$entity_type = \Drupal::state()->get('entity_cache_test');
$this->assertEqual($entity_type->getLabel(), 'Entity Cache Test', 'Entity info label is correct.');
$this->assertEqual($entity_type->getStorageClass(), 'Drupal\Core\Entity\EntityDatabaseStorage', 'Entity handler class info is correct.');
}
}
name: 'Entity cache test'
type: module
description: 'Support module for testing entity cache.'
package: Testing
version: VERSION
core: 8.x
dependencies:
- entity_cache_test_dependency
<?php
/**
* @file
* Helper module for entity cache tests.
*/
/**
* Implements hook_modules_installed().
*
* This hook is called during \Drupal\Core\Extension\ModuleHandler::install()
* and since this hook implementation is invoked, we have to expect that this
* module and dependent modules have been properly installed already. So we
* expect to be able to retrieve the entity information that has been registered
* by the required dependency module.
*
* @see EntityApiInfoTest::testEntityInfoCacheModulesEnabled()
*/
function entity_cache_test_modules_installed($modules_enabled) {
$info = \Drupal::entityManager()->getDefinition('entity_cache_test');
// Store the information in a system variable to analyze it later in the
// test case.
\Drupal::state()->set('entity_cache_test', $info);
}
name: 'Entity cache test dependency'
type: module
description: 'Support dependency module for testing entity cache.'
package: Testing
version: VERSION
core: 8.x
<?php
/**
* @file
* Helper module for entity cache tests.
*/
/**
* Implements hook_entity_type_alter().
*/
function entity_cache_test_dependency_entity_type_alter(array &$entity_types) {
/** @var $entity_types \Drupal\Core\Entity\EntityTypeInterface[] */
$entity_types['entity_cache_test']->set('label', \Drupal::state()->get('entity_cache_test.label') ?: 'Entity Cache Test');
}
<?php
/**
* @file
* Contains Drupal\entity_cache_test_dependency\Entity\EntityCacheTest.
*/
namespace Drupal\entity_cache_test_dependency\Entity;
use Drupal\Core\Entity\Entity;
/**
* Defines the EntityCacheTest class.
*
* @EntityType(
* id = "entity_cache_test",
* label = @Translation("Entity cache test"),
* handlers = {
* "storage" = "Drupal\Core\Entity\EntityDatabaseStorage",
* }
* )
*/
class EntityCacheTest extends Entity {
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment