From 59f38cc342f141ef64f1d81d1166fcb1af878616 Mon Sep 17 00:00:00 2001 From: Lee Rowlands <lee.rowlands@previousnext.com.au> Date: Mon, 19 Feb 2024 07:46:14 +1000 Subject: [PATCH] Issue #3418298 by Akhil Babu, Kanchan Bhogade: Improve the exception message when an entity form class does not exist --- .../Drupal/Core/Entity/EntityTypeManager.php | 6 ++- .../Core/Entity/EntityTypeManagerTest.php | 42 +++++++++++++++++-- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/core/lib/Drupal/Core/Entity/EntityTypeManager.php b/core/lib/Drupal/Core/Entity/EntityTypeManager.php index 1a884dbeda38..30f3b2992736 100644 --- a/core/lib/Drupal/Core/Entity/EntityTypeManager.php +++ b/core/lib/Drupal/Core/Entity/EntityTypeManager.php @@ -207,7 +207,11 @@ public function getListBuilder($entity_type_id) { */ public function getFormObject($entity_type_id, $operation) { if (!$class = $this->getDefinition($entity_type_id, TRUE)->getFormClass($operation)) { - throw new InvalidPluginDefinitionException($entity_type_id, sprintf('The "%s" entity type did not specify a "%s" form class.', $entity_type_id, $operation)); + $handlers = $this->getDefinition($entity_type_id, TRUE)->getHandlerClasses(); + if (!isset($handlers['form'][$operation])) { + throw new InvalidPluginDefinitionException($entity_type_id, sprintf('The "%s" entity type did not specify a "%s" form class.', $entity_type_id, $operation)); + } + throw new InvalidPluginDefinitionException($entity_type_id, sprintf('The "%s" form handler of the "%s" entity type specifies a non-existent class "%s".', $operation, $entity_type_id, $handlers['form'][$operation])); } $form_object = $this->classResolver->getInstanceFromDefinition($class); diff --git a/core/tests/Drupal/Tests/Core/Entity/EntityTypeManagerTest.php b/core/tests/Drupal/Tests/Core/Entity/EntityTypeManagerTest.php index 4e74f0735010..daeaecb92979 100644 --- a/core/tests/Drupal/Tests/Core/Entity/EntityTypeManagerTest.php +++ b/core/tests/Drupal/Tests/Core/Entity/EntityTypeManagerTest.php @@ -248,18 +248,52 @@ public function testGetFormObject() { $this->assertEquals('yellow', $banana_form->color); } + /** + * Provides test data for testGetFormObjectInvalidOperation(). + * + * @return array + * Test data. + */ + public function provideFormObjectInvalidOperationData(): array { + return [ + 'missing_form_handler' => [ + 'test_entity_type', + 'edit', + '', + 'The "test_entity_type" entity type did not specify a "edit" form class.', + ], + 'missing_form_handler_class' => [ + 'test_entity_type', + 'edit', + 'Drupal\test_entity_type\Form\NonExistingClass', + 'The "edit" form handler of the "test_entity_type" entity type specifies a non-existent class "Drupal\test_entity_type\Form\NonExistingClass".', + ], + ]; + } + /** * Tests the getFormObject() method with an invalid operation. * * @covers ::getFormObject + * + * @dataProvider provideFormObjectInvalidOperationData */ - public function testGetFormObjectInvalidOperation() { + public function testGetFormObjectInvalidOperation(string $entity_type_id, string $operation, string $form_class, string $exception_message): void { $entity = $this->prophesize(EntityTypeInterface::class); - $entity->getFormClass('edit')->willReturn(''); - $this->setUpEntityTypeDefinitions(['test_entity_type' => $entity]); + $entity->getFormClass($operation)->willReturn(NULL); + if (!$form_class) { + $entity->getHandlerClasses()->willReturn([]); + } + else { + $entity->getHandlerClasses()->willReturn([ + 'form' => [$operation => $form_class], + ]); + } + $this->setUpEntityTypeDefinitions([$entity_type_id => $entity]); $this->expectException(InvalidPluginDefinitionException::class); - $this->entityTypeManager->getFormObject('test_entity_type', 'edit'); + $this->expectExceptionMessage($exception_message); + $this->entityTypeManager->getFormObject($entity_type_id, $operation); } /** -- GitLab