diff --git a/package_manager/src/Event/PreOperationStageEvent.php b/package_manager/src/Event/PreOperationStageEvent.php index 64f975fb097d72dfac19e3410d7a4cfb4c50dc7f..c493c2a44a17eccf2d0354d39026f7b3a3c11002 100644 --- a/package_manager/src/Event/PreOperationStageEvent.php +++ b/package_manager/src/Event/PreOperationStageEvent.php @@ -6,6 +6,7 @@ namespace Drupal\package_manager\Event; use Drupal\Core\StringTranslation\TranslatableMarkup; use Drupal\package_manager\ValidationResult; +use Drupal\system\SystemManager; /** * Base class for events dispatched before a stage life cycle operation. @@ -63,4 +64,14 @@ abstract class PreOperationStageEvent extends StageEvent { $this->results[] = ValidationResult::createErrorFromThrowable($throwable, $summary); } + /** + * {@inheritdoc} + */ + public function stopPropagation(): void { + if (empty($this->getResults(SystemManager::REQUIREMENT_ERROR))) { + $this->addErrorFromThrowable(new \LogicException('Event propagation stopped without any errors added to the event. This bypasses the package_manager validation system.')); + } + parent::stopPropagation(); + } + } diff --git a/package_manager/tests/src/Kernel/StageEventsTest.php b/package_manager/tests/src/Kernel/StageEventsTest.php index 06161dccd4c838cb068fe9d832ee4ce7cbb2f83c..21abdab1050144263741bbc13e7a6a70d896438e 100644 --- a/package_manager/tests/src/Kernel/StageEventsTest.php +++ b/package_manager/tests/src/Kernel/StageEventsTest.php @@ -194,4 +194,19 @@ class StageEventsTest extends PackageManagerKernelTestBase implements EventSubsc (new PreApplyEvent($stage))->excludePath('/junk/drawer'); } + /** + * Tests exception is thrown if error is not added before stopPropagation(). + */ + public function testExceptionIfNoErrorBeforeStopPropagation(): void { + $listener = function (PreCreateEvent $event): void { + $event->stopPropagation(); + }; + $this->addEventTestListener($listener, PreCreateEvent::class); + + $this->expectException(TestStageValidationException::class); + $this->expectExceptionMessage('Event propagation stopped without any errors added to the event. This bypasses the package_manager validation system.'); + $stage = $this->createStage(); + $stage->create(); + } + }