summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorcatch <catch@35733.no-reply.drupal.org>2021-10-28 20:54:30 +0100
committercatch <catch@35733.no-reply.drupal.org>2021-10-28 20:54:30 +0100
commitcefb93c5f08bd571ec4c0191a63c4976be72b5ce (patch)
treedc730c3bcb6c7e1a0b6a1391bf10bd5070850bb7
parent3eba4b3c583e94b3e2306ca0c141251e0939d7b1 (diff)
downloaddrupal-cefb93c5f08bd571ec4c0191a63c4976be72b5ce.tar.gz
drupal-cefb93c5f08bd571ec4c0191a63c4976be72b5ce.zip
Issue #3246150 by dww, larowlan, Berdir, alexpott, craigra: Bundle class changes mean the entity class is now determined by the active entity-type definition
-rw-r--r--core/lib/Drupal/Core/Entity/EntityStorageBase.php19
-rw-r--r--core/modules/system/tests/modules/entity_test_bundle_class/entity_test_bundle_class.module11
-rw-r--r--core/modules/system/tests/modules/entity_test_bundle_class/src/Entity/EntityTestVariant.php12
-rw-r--r--core/modules/system/tests/modules/entity_test_deprecated_storage/src/Storage/DeprecatedEntityStorage.php3
-rw-r--r--core/tests/Drupal/KernelTests/Core/Entity/BundleClassTest.php14
-rw-r--r--core/tests/Drupal/Tests/Core/Entity/EntityStorageDeprecationTest.php3
-rw-r--r--core/tests/Drupal/Tests/Core/Entity/KeyValueStore/KeyValueEntityStorageTest.php8
7 files changed, 56 insertions, 14 deletions
diff --git a/core/lib/Drupal/Core/Entity/EntityStorageBase.php b/core/lib/Drupal/Core/Entity/EntityStorageBase.php
index f667514e848..ca3e1e04d37 100644
--- a/core/lib/Drupal/Core/Entity/EntityStorageBase.php
+++ b/core/lib/Drupal/Core/Entity/EntityStorageBase.php
@@ -60,16 +60,16 @@ abstract class EntityStorageBase extends EntityHandlerBase implements EntityStor
protected $uuidService;
/**
- * Name of the entity class (if set directly via deprecated means).
+ * Name of the base entity class.
+ *
+ * This is a private property since it's not meant to be set by child classes.
+ * It holds the name of the entity class defined in the entity type that is
+ * passed in to the constructor when instantiating an entity storage class.
*
- * This is a private property since it's only here to support backwards
- * compatibility for deprecated code paths in contrib and custom code.
* Normally, the entity class is defined via an annotation when defining an
* entity type, via hook_entity_bundle_info() or via
- * hook_entity_bundle_info_alter().
- *
- * @todo Remove this in Drupal 10.
- * @see https://www.drupal.org/project/drupal/issues/3244802
+ * hook_entity_bundle_info_alter(). However, due to how this property works,
+ * the entity class can also be controlled via hook_entity_type_alter().
*
* @var string|null
*/
@@ -100,6 +100,7 @@ abstract class EntityStorageBase extends EntityHandlerBase implements EntityStor
public function __construct(EntityTypeInterface $entity_type, MemoryCacheInterface $memory_cache) {
$this->entityTypeId = $entity_type->id();
$this->entityType = $entity_type;
+ $this->baseEntityClass = $entity_type->getClass();
$this->idKey = $this->entityType->getKey('id');
$this->uuidKey = $this->entityType->getKey('uuid');
$this->langcodeKey = $this->entityType->getKey('langcode');
@@ -111,9 +112,7 @@ abstract class EntityStorageBase extends EntityHandlerBase implements EntityStor
* {@inheritdoc}
*/
public function getEntityClass(?string $bundle = NULL): string {
- // @todo Simplify this in Drupal 10 to return $this->entityType->getClass().
- // @see https://www.drupal.org/project/drupal/issues/3244802
- return $this->baseEntityClass ?? $this->entityType->getClass();
+ return $this->baseEntityClass;
}
/**
diff --git a/core/modules/system/tests/modules/entity_test_bundle_class/entity_test_bundle_class.module b/core/modules/system/tests/modules/entity_test_bundle_class/entity_test_bundle_class.module
index 7b40ac67a4e..e59d72f9d90 100644
--- a/core/modules/system/tests/modules/entity_test_bundle_class/entity_test_bundle_class.module
+++ b/core/modules/system/tests/modules/entity_test_bundle_class/entity_test_bundle_class.module
@@ -8,6 +8,7 @@
use Drupal\entity_test_bundle_class\Entity\EntityTestAmbiguousBundleClass;
use Drupal\entity_test_bundle_class\Entity\EntityTestBundleClass;
use Drupal\entity_test_bundle_class\Entity\EntityTestUserClass;
+use Drupal\entity_test_bundle_class\Entity\EntityTestVariant;
use Drupal\entity_test_bundle_class\Entity\NonInheritingBundleClass;
/**
@@ -32,3 +33,13 @@ function entity_test_bundle_class_entity_bundle_info_alter(&$bundles) {
$bundles['user']['user']['class'] = EntityTestUserClass::class;
}
}
+
+/**
+ * Implements hook_entity_type_alter().
+ */
+function entity_test_bundle_class_entity_type_alter(&$entity_types) {
+ /** @var \Drupal\Core\Entity\EntityTypeInterface[] $entity_types */
+ if (\Drupal::state()->get('entity_test_bundle_class_override_base_class', FALSE) && isset($entity_types['entity_test'])) {
+ $entity_types['entity_test']->setClass(EntityTestVariant::class);
+ }
+}
diff --git a/core/modules/system/tests/modules/entity_test_bundle_class/src/Entity/EntityTestVariant.php b/core/modules/system/tests/modules/entity_test_bundle_class/src/Entity/EntityTestVariant.php
new file mode 100644
index 00000000000..6957cf2eb84
--- /dev/null
+++ b/core/modules/system/tests/modules/entity_test_bundle_class/src/Entity/EntityTestVariant.php
@@ -0,0 +1,12 @@
+<?php
+
+namespace Drupal\entity_test_bundle_class\Entity;
+
+use Drupal\entity_test\Entity\EntityTest;
+
+/**
+ * Defines a custom class to use for EntityTest.
+ *
+ * @see entity_test_bundle_class_entity_type_alter()
+ */
+class EntityTestVariant extends EntityTest {}
diff --git a/core/modules/system/tests/modules/entity_test_deprecated_storage/src/Storage/DeprecatedEntityStorage.php b/core/modules/system/tests/modules/entity_test_deprecated_storage/src/Storage/DeprecatedEntityStorage.php
index a5752c203b7..6583a31ae07 100644
--- a/core/modules/system/tests/modules/entity_test_deprecated_storage/src/Storage/DeprecatedEntityStorage.php
+++ b/core/modules/system/tests/modules/entity_test_deprecated_storage/src/Storage/DeprecatedEntityStorage.php
@@ -6,6 +6,9 @@ use Drupal\Core\Entity\Sql\SqlContentEntityStorage;
/**
* Class for testing deprecation warnings from EntityStorageBase.
+ *
+ * @todo Remove this in Drupal 10.
+ * @see https://www.drupal.org/project/drupal/issues/3244802
*/
class DeprecatedEntityStorage extends SqlContentEntityStorage {
diff --git a/core/tests/Drupal/KernelTests/Core/Entity/BundleClassTest.php b/core/tests/Drupal/KernelTests/Core/Entity/BundleClassTest.php
index 4cd394a5e32..8f1d4474463 100644
--- a/core/tests/Drupal/KernelTests/Core/Entity/BundleClassTest.php
+++ b/core/tests/Drupal/KernelTests/Core/Entity/BundleClassTest.php
@@ -8,6 +8,7 @@ use Drupal\entity_test\Entity\EntityTest;
use Drupal\entity_test_bundle_class\Entity\EntityTestAmbiguousBundleClass;
use Drupal\entity_test_bundle_class\Entity\EntityTestBundleClass;
use Drupal\entity_test_bundle_class\Entity\EntityTestUserClass;
+use Drupal\entity_test_bundle_class\Entity\EntityTestVariant;
use Drupal\user\Entity\User;
/**
@@ -248,4 +249,17 @@ class BundleClassTest extends EntityKernelTestBase {
$this->storage->create(['type' => 'bundle_class']);
}
+ /**
+ * Tests that a module can override an entity-type class.
+ *
+ * Ensures a module can implement hook_entity_info_alter() and alter the
+ * entity's class without needing to write to the last installed
+ * definitions repository.
+ */
+ public function testEntityClassNotTakenFromActiveDefinitions(): void {
+ $this->container->get('state')->set('entity_test_bundle_class_override_base_class', TRUE);
+ $this->entityTypeManager->clearCachedDefinitions();
+ $this->assertEquals(EntityTestVariant::class, $this->entityTypeManager->getStorage('entity_test')->getEntityClass());
+ }
+
}
diff --git a/core/tests/Drupal/Tests/Core/Entity/EntityStorageDeprecationTest.php b/core/tests/Drupal/Tests/Core/Entity/EntityStorageDeprecationTest.php
index e6575cfef1e..1e38f467d48 100644
--- a/core/tests/Drupal/Tests/Core/Entity/EntityStorageDeprecationTest.php
+++ b/core/tests/Drupal/Tests/Core/Entity/EntityStorageDeprecationTest.php
@@ -15,6 +15,9 @@ use Drupal\entity_test_deprecated_storage\Storage\DeprecatedEntityStorage;
* @coversDefaultClass \Drupal\Core\Entity\EntityStorageBase
* @group Entity
* @group legacy
+ *
+ * @todo Remove this in Drupal 10.
+ * @see https://www.drupal.org/project/drupal/issues/3244802
*/
class EntityStorageDeprecationTest extends UnitTestCase {
diff --git a/core/tests/Drupal/Tests/Core/Entity/KeyValueStore/KeyValueEntityStorageTest.php b/core/tests/Drupal/Tests/Core/Entity/KeyValueStore/KeyValueEntityStorageTest.php
index d790c8608c5..3131893fcc1 100644
--- a/core/tests/Drupal/Tests/Core/Entity/KeyValueStore/KeyValueEntityStorageTest.php
+++ b/core/tests/Drupal/Tests/Core/Entity/KeyValueStore/KeyValueEntityStorageTest.php
@@ -150,7 +150,7 @@ class KeyValueEntityStorageTest extends UnitTestCase {
* @covers ::doCreate
*/
public function testCreateWithPredefinedUuid() {
- $this->entityType->expects($this->exactly(2))
+ $this->entityType->expects($this->once())
->method('getClass')
->will($this->returnValue(get_class($this->getMockEntity())));
$this->setUpKeyValueEntityStorage();
@@ -173,7 +173,7 @@ class KeyValueEntityStorageTest extends UnitTestCase {
*/
public function testCreateWithoutUuidKey() {
// Set up the entity storage to expect no UUID key.
- $this->entityType->expects($this->exactly(2))
+ $this->entityType->expects($this->once())
->method('getClass')
->will($this->returnValue(get_class($this->getMockEntity())));
$this->setUpKeyValueEntityStorage(NULL);
@@ -198,7 +198,7 @@ class KeyValueEntityStorageTest extends UnitTestCase {
*/
public function testCreate() {
$entity = $this->getMockEntity('Drupal\Core\Entity\EntityBase', [], ['toArray']);
- $this->entityType->expects($this->exactly(2))
+ $this->entityType->expects($this->once())
->method('getClass')
->will($this->returnValue(get_class($entity)));
$this->setUpKeyValueEntityStorage();
@@ -512,7 +512,7 @@ class KeyValueEntityStorageTest extends UnitTestCase {
public function testLoadMultipleAll() {
$expected['foo'] = $this->getMockEntity('Drupal\Core\Entity\EntityBase', [['id' => 'foo']]);
$expected['bar'] = $this->getMockEntity('Drupal\Core\Entity\EntityBase', [['id' => 'bar']]);
- $this->entityType->expects($this->exactly(2))
+ $this->entityType->expects($this->once())
->method('getClass')
->will($this->returnValue(get_class(reset($expected))));
$this->setUpKeyValueEntityStorage();