diff --git a/entity_reference_integrity.services.yml b/entity_reference_integrity.services.yml index 8dc1fa86c0ad445a3b922bce286a6c5332db124a..34f1af03743a99b24dfbb3ea78bb373a345bbb2c 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/modules/entity_reference_integrity_enforce/src/EntityPredelete.php b/modules/entity_reference_integrity_enforce/src/EntityPredelete.php index 756efe06423eb0788528928a7fdad83d47eca328..014392614fdd01a065035d51b87336dc12ee5000 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 430944ef9308213fda609fed6804cc06a80d4544..93c62282cfe42ef094f942bbc372b834d1e8c356 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']); 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 3b23a591589980c357893c9aaea8e0a3c70e35d4..ca90beb6f739d3ef2e92182a662b538e6daff67a 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)); } diff --git a/src/EntityReferenceDependencyManager.php b/src/EntityReferenceDependencyManager.php deleted file mode 100644 index 2acb67ac8ec5f49e8c77ef066223d45c847d0fbd..0000000000000000000000000000000000000000 --- 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); - } - -} diff --git a/src/EntityReferenceIntegrityEntityHandler.php b/src/EntityReferenceIntegrityEntityHandler.php index 9185e9c4417616105eb8b395ff8fa83b004ac0db..c829866e41c56082aebb82dab9f47c98dd9c50c8 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. @@ -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; diff --git a/src/EntityReferenceDependencyManagerInterface.php b/src/EntityReferenceIntegrityEntityHandlerInterface.php similarity index 96% rename from src/EntityReferenceDependencyManagerInterface.php rename to src/EntityReferenceIntegrityEntityHandlerInterface.php index 988a5ccf7997d7e5f164052f03d9cfe6db3f8cb1..9285a53b0b25658b4ea6637adc4e4dbb0f6cf92a 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. 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 4d01a55ac4876df9a1370cf84da46173c526b9aa..37216fd51dcdc109041b2ffca406f03270a832da 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()); } }