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