From f542721730d97c8810c9dd32a6419cd2b1041577 Mon Sep 17 00:00:00 2001 From: Ioannis Igoumenos Date: Mon, 15 Jun 2026 10:29:52 +0300 Subject: [PATCH] Make RuleBuilder buildRules idempotent to prevent duplicate rule-name exceptions in PHPUnit --- .../Lib/Events/RuleBuilderEventListener.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/app/src/Lib/Events/RuleBuilderEventListener.php b/app/src/Lib/Events/RuleBuilderEventListener.php index 7dd427fb0..9d5451512 100644 --- a/app/src/Lib/Events/RuleBuilderEventListener.php +++ b/app/src/Lib/Events/RuleBuilderEventListener.php @@ -39,6 +39,16 @@ class RuleBuilderEventListener Implements EventListenerInterface { use \App\Lib\Traits\LabeledLogTrait; + + /** + * Track which RulesChecker instances we've already modified, to avoid adding + * duplicate rules (which can trigger duplicate rule-name exceptions). + * + * Key format: "#" + * + * @var array + */ + private static array $buildRulesRan = []; /** * Build rules event listener. @@ -69,6 +79,14 @@ public function buildRules(Event $event, RulesChecker $rules) { } + $onceKey = $subjectTable->getRegistryAlias() . '#' . spl_object_id($rules); + if (isset(self::$buildRulesRan[$onceKey])) { + // Already built rules for this table+rules checker; avoid duplicate rule-name exceptions. + $event->setResult($rules); + return; + } + self::$buildRulesRan[$onceKey] = true; + $schema = $subjectTable->getSchema(); // We need to skip some metadata fields, including changelog and EIS fks