From b7f9e3225b7b9aba691f98219b42db2c7983dcba Mon Sep 17 00:00:00 2001 From: Michael Stenta <mike@mstenta.net> Date: Fri, 28 Feb 2025 09:28:50 -0500 Subject: [PATCH 1/6] Refactor EntityReferenceDependencyManagerTest into EntityReferenceIntegrityEntityHandlerTest. --- ...tyReferenceIntegrityEntityHandlerTest.php} | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) rename tests/src/Kernel/{EntityReferenceDependencyManagerTest.php => EntityReferenceIntegrityEntityHandlerTest.php} (61%) diff --git a/tests/src/Kernel/EntityReferenceDependencyManagerTest.php b/tests/src/Kernel/EntityReferenceIntegrityEntityHandlerTest.php similarity index 61% rename from tests/src/Kernel/EntityReferenceDependencyManagerTest.php rename to tests/src/Kernel/EntityReferenceIntegrityEntityHandlerTest.php index 4d01a55..37216fd 100644 --- a/tests/src/Kernel/EntityReferenceDependencyManagerTest.php +++ b/tests/src/Kernel/EntityReferenceIntegrityEntityHandlerTest.php @@ -7,13 +7,13 @@ use Drupal\node\Entity\Node; use Drupal\user\Entity\User; /** - * Test the EntityReferenceDependencyManager. + * Test the EntityReferenceIntegrityEntityHandler. * - * @coversDefaultClass \Drupal\entity_reference_integrity\EntityReferenceDependencyManager + * @coversDefaultClass \Drupal\entity_reference_integrity\EntityReferenceIntegrityEntityHandler * * @group entity_reference_integrity */ -class EntityReferenceDependencyManagerTest extends KernelTestBase { +class EntityReferenceIntegrityEntityHandlerTest extends KernelTestBase { /** * Modules to enable. @@ -28,11 +28,11 @@ class EntityReferenceDependencyManagerTest extends KernelTestBase { ]; /** - * The entity dependency manager. + * The entity type manager. * - * @var \Drupal\entity_reference_integrity\EntityReferenceDependencyManagerInterface + * @var \Drupal\Core\Entity\EntityTypeManagerInterface */ - protected $dependencyManager; + protected $entityTypeManager; /** * A test user. @@ -58,7 +58,7 @@ class EntityReferenceDependencyManagerTest extends KernelTestBase { $this->installSchema('system', 'sequences'); $this->installSchema('node', 'node_access'); - $this->dependencyManager = $this->container->get('entity_reference_integrity.dependency_manager'); + $this->entityTypeManager = $this->container->get('entity_type.manager'); $this->testUser = User::create([ 'name' => 'Gerald', @@ -86,9 +86,10 @@ class EntityReferenceDependencyManagerTest extends KernelTestBase { * @covers ::hasDependents */ public function testHasDependents() { - $this->assertFalse($this->dependencyManager->hasDependents($this->testUser)); + $handler = $this->entityTypeManager->getHandler('user', 'entity_reference_integrity'); + $this->assertFalse($handler->hasDependents($this->testUser)); $this->setUserAsNodeAuthor(); - $this->assertTrue($this->dependencyManager->hasDependents($this->testUser)); + $this->assertTrue($handler->hasDependents($this->testUser)); } /** @@ -97,9 +98,10 @@ class EntityReferenceDependencyManagerTest extends KernelTestBase { * @covers ::getDependentEntityIds */ public function testGetDependentEntityIds() { - $this->assertEquals([], $this->dependencyManager->getDependentEntityIds($this->testUser)); + $handler = $this->entityTypeManager->getHandler('user', 'entity_reference_integrity'); + $this->assertEquals([], $handler->getDependentEntityIds($this->testUser)); $this->setUserAsNodeAuthor(); - $this->assertEquals($this->testNode->id(), $this->dependencyManager->getDependentEntityIds($this->testUser)['node'][0]); + $this->assertEquals($this->testNode->id(), $handler->getDependentEntityIds($this->testUser)['node'][0]); } /** @@ -108,9 +110,10 @@ class EntityReferenceDependencyManagerTest extends KernelTestBase { * @covers ::getDependentEntities */ public function testGetDependentEntities() { - $this->assertEquals([], $this->dependencyManager->getDependentEntities($this->testUser)); + $handler = $this->entityTypeManager->getHandler($this->testUser->getEntityTypeId(), 'entity_reference_integrity'); + $this->assertEquals([], $handler->getDependentEntities($this->testUser)); $this->setUserAsNodeAuthor(); - $this->assertEquals($this->testNode->id(), $this->dependencyManager->getDependentEntities($this->testUser)['node'][0]->id()); + $this->assertEquals($this->testNode->id(), $handler->getDependentEntities($this->testUser)['node'][0]->id()); } } -- GitLab From 330354e03a4989a030deda0b1ba912219d99af3a Mon Sep 17 00:00:00 2001 From: Michael Stenta <mike@mstenta.net> Date: Fri, 28 Feb 2025 09:30:54 -0500 Subject: [PATCH 2/6] Fix EntityReferenceIntegrityEntityHandler::__construct() docblock comment. --- src/EntityReferenceIntegrityEntityHandler.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/EntityReferenceIntegrityEntityHandler.php b/src/EntityReferenceIntegrityEntityHandler.php index 9185e9c..856160d 100644 --- a/src/EntityReferenceIntegrityEntityHandler.php +++ b/src/EntityReferenceIntegrityEntityHandler.php @@ -29,7 +29,7 @@ class EntityReferenceIntegrityEntityHandler implements EntityHandlerInterface, E protected $entityTypeManager; /** - * Create an EntityReferenceDependencyManager. + * Create an EntityReferenceIntegrityEntityHandler. */ public function __construct(DependencyFieldMapGeneratorInterface $fieldMap, EntityTypeManagerInterface $entityTypeManager) { $this->fieldMap = $fieldMap; -- GitLab From aa3c0f7aa81cf8b357ad2c1200d609c93e7ae938 Mon Sep 17 00:00:00 2001 From: Michael Stenta <mike@mstenta.net> Date: Fri, 28 Feb 2025 09:36:06 -0500 Subject: [PATCH 3/6] Refactor DeleteActionTest to use entity_type_integrity entity handler. --- .../tests/src/Kernel/DeleteActionTest.php | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/modules/entity_reference_integrity_enforce/tests/src/Kernel/DeleteActionTest.php b/modules/entity_reference_integrity_enforce/tests/src/Kernel/DeleteActionTest.php index 3b23a59..ca90beb 100644 --- a/modules/entity_reference_integrity_enforce/tests/src/Kernel/DeleteActionTest.php +++ b/modules/entity_reference_integrity_enforce/tests/src/Kernel/DeleteActionTest.php @@ -41,11 +41,11 @@ class DeleteActionTest extends KernelTestBase { protected $actionManager; /** - * The entity dependency manager. + * The entity type manager. * - * @var \Drupal\entity_reference_integrity\EntityReferenceDependencyManagerInterface + * @var \Drupal\Core\Entity\EntityTypeManagerInterface */ - protected $dependencyManager; + protected $entityTypeManager; /** * A test user. @@ -79,7 +79,8 @@ class DeleteActionTest extends KernelTestBase { $this->installSchema('node', ['node_access']); $this->actionManager = $this->container->get('plugin.manager.action'); - $this->dependencyManager = $this->container->get('entity_reference_integrity.dependency_manager'); + + $this->entityTypeManager = $this->container->get('entity_type.manager'); // Create a new node-type. NodeType::create([ @@ -123,6 +124,10 @@ class DeleteActionTest extends KernelTestBase { * Test that delete action denies access to protected entities. */ public function testDeleteAction() { + + // Get the entity_reference_integrity entity handler. + $handler = $this->entityTypeManager->getHandler('node', 'entity_reference_integrity'); + // Ensure the DeleteAction exists and is using the extended class. $actions = $this->actionManager->getDefinitions(); $this->assertArrayHasKey('entity:delete_action:node', $actions); @@ -130,7 +135,7 @@ class DeleteActionTest extends KernelTestBase { $action = $this->actionManager->createInstance('entity:delete_action:node'); // The referencedNode has dependents, the action should deny access. - $this->assertTrue($this->dependencyManager->hasDependents($this->referencedNode)); + $this->assertTrue($handler->hasDependents($this->referencedNode)); $this->assertFalse($action->access($this->referencedNode, $this->testUser)); // Unset the node reference. @@ -138,7 +143,7 @@ class DeleteActionTest extends KernelTestBase { $this->testNode->save(); // The referencedNode has no dependents, the action should allow access. - $this->assertFalse($this->dependencyManager->hasDependents($this->referencedNode)); + $this->assertFalse($handler->hasDependents($this->referencedNode)); $this->assertTrue($action->access($this->referencedNode, $this->testUser)); } -- GitLab From aedfc4c68f52962ef08b9aceee729a5fd5b8105f Mon Sep 17 00:00:00 2001 From: Michael Stenta <mike@mstenta.net> Date: Fri, 28 Feb 2025 09:50:38 -0500 Subject: [PATCH 4/6] Refactor EntityPredelete and FormAlter classes to use entity_reference_integrity entity handler. --- .../src/EntityPredelete.php | 27 ++++++++++++------- .../src/FormAlter.php | 27 ++++++++++++------- 2 files changed, 35 insertions(+), 19 deletions(-) diff --git a/modules/entity_reference_integrity_enforce/src/EntityPredelete.php b/modules/entity_reference_integrity_enforce/src/EntityPredelete.php index 756efe0..0143926 100644 --- a/modules/entity_reference_integrity_enforce/src/EntityPredelete.php +++ b/modules/entity_reference_integrity_enforce/src/EntityPredelete.php @@ -4,7 +4,7 @@ namespace Drupal\entity_reference_integrity_enforce; use Drupal\Core\DependencyInjection\ContainerInjectionInterface; use Drupal\Core\Entity\EntityInterface; -use Drupal\entity_reference_integrity\EntityReferenceDependencyManagerInterface; +use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\entity_reference_integrity_enforce\Exception\ProtectedEntityException; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -14,11 +14,11 @@ use Symfony\Component\DependencyInjection\ContainerInterface; class EntityPredelete implements ContainerInjectionInterface { /** - * The dependency manager. + * The entity type manager. * - * @var \Drupal\entity_reference_integrity\EntityReferenceDependencyManagerInterface + * @var \Drupal\Core\Entity\EntityTypeManagerInterface */ - protected $dependencyManager; + protected $entityTypeManager; /** * The entity type IDs protection is enabled for. @@ -28,10 +28,15 @@ class EntityPredelete implements ContainerInjectionInterface { protected $enabledEntityTypeIds; /** - * Create a DeleteFormAlter object. + * Create a EntityPredelete object. + * + * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager + * The entity type manager. + * @param array $enabled_entity_type_ids + * The entity type IDs protection is enabled for. */ - public function __construct(EntityReferenceDependencyManagerInterface $calculator, array $enabled_entity_type_ids) { - $this->dependencyManager = $calculator; + public function __construct(EntityTypeManagerInterface $entity_type_manager, array $enabled_entity_type_ids) { + $this->entityTypeManager = $entity_type_manager; $this->enabledEntityTypeIds = $enabled_entity_type_ids; } @@ -40,7 +45,7 @@ class EntityPredelete implements ContainerInjectionInterface { */ public static function create(ContainerInterface $container) { return new static( - $container->get('entity_reference_integrity.dependency_manager'), + $container->get('entity_type.manager'), $container->get('config.factory')->get('entity_reference_integrity_enforce.settings')->get('enabled_entity_type_ids') ); } @@ -49,7 +54,11 @@ class EntityPredelete implements ContainerInjectionInterface { * Implements hook_entity_delete(). */ public function entityDelete(EntityInterface $entity) { - if (in_array($entity->getEntityTypeId(), $this->enabledEntityTypeIds, TRUE) && $this->dependencyManager->hasDependents($entity)) { + if (!in_array($entity->getEntityTypeId(), $this->enabledEntityTypeIds, TRUE)) { + return; + } + $handler = $this->entityTypeManager->getHandler($entity->getEntityTypeId(), 'entity_reference_integrity'); + if ($handler->hasDependents($entity)) { throw new ProtectedEntityException(sprintf('Cannot delete "%s" of type "%s" with label "%s" and ID "%s" because other content is referencing it and the integrity of this entity type is enforced.', $entity->getEntityTypeId(), $entity->bundle(), $entity->label(), $entity->id())); } } diff --git a/modules/entity_reference_integrity_enforce/src/FormAlter.php b/modules/entity_reference_integrity_enforce/src/FormAlter.php index 430944e..93c6228 100644 --- a/modules/entity_reference_integrity_enforce/src/FormAlter.php +++ b/modules/entity_reference_integrity_enforce/src/FormAlter.php @@ -4,9 +4,9 @@ namespace Drupal\entity_reference_integrity_enforce; use Drupal\Core\DependencyInjection\ContainerInjectionInterface; use Drupal\Core\Entity\EntityFormInterface; +use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\StringTranslation\StringTranslationTrait; -use Drupal\entity_reference_integrity\EntityReferenceDependencyManagerInterface; use Symfony\Component\DependencyInjection\ContainerInterface; /** @@ -17,11 +17,11 @@ class FormAlter implements ContainerInjectionInterface { use StringTranslationTrait; /** - * The dependency manager. + * The entity type manager. * - * @var \Drupal\entity_reference_integrity\EntityReferenceDependencyManagerInterface + * @var \Drupal\Core\Entity\EntityTypeManagerInterface */ - protected $dependencyManager; + protected $entityTypeManager; /** * The entity type IDs protection is enabled for. @@ -31,10 +31,15 @@ class FormAlter implements ContainerInjectionInterface { protected $enabledEntityTypeIds; /** - * Create a DeleteFormAlter object. + * Create a FormAlter object. + * + * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager + * The entity type manager. + * @param array $enabled_entity_type_ids + * The entity type IDs protection is enabled for. */ - public function __construct(EntityReferenceDependencyManagerInterface $calculator, $enabled_entity_type_ids) { - $this->dependencyManager = $calculator; + public function __construct(EntityTypeManagerInterface $entity_type_manager, array $enabled_entity_type_ids) { + $this->entityTypeManager = $entity_type_manager; $this->enabledEntityTypeIds = $enabled_entity_type_ids; } @@ -43,7 +48,7 @@ class FormAlter implements ContainerInjectionInterface { */ public static function create(ContainerInterface $container) { return new static( - $container->get('entity_reference_integrity.dependency_manager'), + $container->get('entity_type.manager'), $container->get('config.factory')->get('entity_reference_integrity_enforce.settings')->get('enabled_entity_type_ids') ); } @@ -60,8 +65,10 @@ class FormAlter implements ContainerInjectionInterface { $entity = $form_object->getEntity(); - if (in_array($entity->getEntityTypeId(), $this->enabledEntityTypeIds, TRUE) && $this->dependencyManager->hasDependents($entity)) { - $referencing_entities = $this->dependencyManager->getDependentEntities($entity); + $handler = $this->entityTypeManager->getHandler($entity->getEntityTypeId(), 'entity_reference_integrity'); + + if (in_array($entity->getEntityTypeId(), $this->enabledEntityTypeIds, TRUE) && $handler->hasDependents($entity)) { + $referencing_entities = $handler->getDependentEntities($entity); unset($form['actions']['submit']); unset($form['description']); -- GitLab From 72a5c4b8ccf3ef752c6e0019839a94ab1ef1dada Mon Sep 17 00:00:00 2001 From: Michael Stenta <mike@mstenta.net> Date: Fri, 28 Feb 2025 09:21:05 -0500 Subject: [PATCH 5/6] Remove EntityReferenceDependencyManager. --- entity_reference_integrity.services.yml | 3 -- src/EntityReferenceDependencyManager.php | 67 ------------------------ 2 files changed, 70 deletions(-) delete mode 100644 src/EntityReferenceDependencyManager.php diff --git a/entity_reference_integrity.services.yml b/entity_reference_integrity.services.yml index 8dc1fa8..34f1af0 100644 --- a/entity_reference_integrity.services.yml +++ b/entity_reference_integrity.services.yml @@ -1,7 +1,4 @@ services: - entity_reference_integrity.dependency_manager: - class: \Drupal\entity_reference_integrity\EntityReferenceDependencyManager - arguments: ['@entity_type.manager'] entity_reference_integrity.field_map: class: \Drupal\entity_reference_integrity\DependencyFieldMapGenerator arguments: ['@entity_field.manager', '@entity_type.manager', 'entity_reference', 'target_type'] diff --git a/src/EntityReferenceDependencyManager.php b/src/EntityReferenceDependencyManager.php deleted file mode 100644 index 2acb67a..0000000 --- a/src/EntityReferenceDependencyManager.php +++ /dev/null @@ -1,67 +0,0 @@ -<?php - -namespace Drupal\entity_reference_integrity; - -use Drupal\Core\Entity\EntityInterface; -use Drupal\Core\Entity\EntityTypeManagerInterface; - -/** - * Calculate entity dependencies based on entity reference fields. - * - * @deprecated in entity_reference_integrity:8.x-1.2 and is removed from - * entity_reference_integrity:2.0.0. Use the entity_reference_integrity entity - * handler instead. - * @see https://www.drupal.org/node/3509671 - * @see https://www.drupal.org/project/entity_reference_integrity/issues/3509653 - */ -class EntityReferenceDependencyManager implements EntityReferenceDependencyManagerInterface { - - /** - * The entity type manager. - * - * @var \Drupal\Core\Entity\EntityTypeManagerInterface - */ - protected $entityTypeManager; - - /** - * Create an EntityReferenceDependencyManager. - */ - public function __construct(EntityTypeManagerInterface $entityTypeManager) { - $this->entityTypeManager = $entityTypeManager; - } - - /** - * {@inheritdoc} - */ - public function hasDependents(EntityInterface $entity) { - return $this->entityTypeManager - ->getHandler($entity->getEntityTypeId(), 'entity_reference_integrity') - ->hasDependents($entity); - } - - /** - * {@inheritdoc} - */ - public function getDependentEntityIds(EntityInterface $entity) { - return $this->entityTypeManager - ->getHandler($entity->getEntityTypeId(), 'entity_reference_integrity') - ->getDependentEntityIds($entity); - } - - /** - * {@inheritdoc} - */ - public function getDependentEntities(EntityInterface $entity) { - return $this->entityTypeManager - ->getHandler($entity->getEntityTypeId(), 'entity_reference_integrity') - ->getDependentEntities($entity); - } - - /** - * {@inheritdoc} - */ - public static function getAccessDeniedReason(EntityInterface $entity, bool $translate = TRUE) { - return EntityReferenceIntegrityEntityHandler::getAccessDeniedReason($entity, $translate); - } - -} -- GitLab From eb0c0824fc7f2a2e87335612f6875ccad21219f6 Mon Sep 17 00:00:00 2001 From: Michael Stenta <mike@mstenta.net> Date: Fri, 28 Feb 2025 09:53:27 -0500 Subject: [PATCH 6/6] Rename EntityReferenceIntegrityDependencyManagerInterface to EntityReferenceIntegrityEntityHandlerInterface. --- src/EntityReferenceIntegrityEntityHandler.php | 2 +- ...e.php => EntityReferenceIntegrityEntityHandlerInterface.php} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/{EntityReferenceDependencyManagerInterface.php => EntityReferenceIntegrityEntityHandlerInterface.php} (96%) diff --git a/src/EntityReferenceIntegrityEntityHandler.php b/src/EntityReferenceIntegrityEntityHandler.php index 856160d..c829866 100644 --- a/src/EntityReferenceIntegrityEntityHandler.php +++ b/src/EntityReferenceIntegrityEntityHandler.php @@ -12,7 +12,7 @@ use Symfony\Component\DependencyInjection\ContainerInterface; /** * Entity reference integrity entity handler. */ -class EntityReferenceIntegrityEntityHandler implements EntityHandlerInterface, EntityReferenceDependencyManagerInterface { +class EntityReferenceIntegrityEntityHandler implements EntityHandlerInterface, EntityReferenceIntegrityEntityHandlerInterface { /** * A referential field map. diff --git a/src/EntityReferenceDependencyManagerInterface.php b/src/EntityReferenceIntegrityEntityHandlerInterface.php similarity index 96% rename from src/EntityReferenceDependencyManagerInterface.php rename to src/EntityReferenceIntegrityEntityHandlerInterface.php index 988a5cc..9285a53 100644 --- a/src/EntityReferenceDependencyManagerInterface.php +++ b/src/EntityReferenceIntegrityEntityHandlerInterface.php @@ -7,7 +7,7 @@ use Drupal\Core\Entity\EntityInterface; /** * An interface for calculating entity dependency. */ -interface EntityReferenceDependencyManagerInterface { +interface EntityReferenceIntegrityEntityHandlerInterface { /** * Check if an entity has dependent entities. -- GitLab