refactor(form-builder): strict validator on save; strip rules.unique fallback
This commit is contained in:
@@ -38,6 +38,7 @@ final class FormFieldService
|
||||
$data['sort_order'] ??= $this->nextSortOrder($schema);
|
||||
|
||||
$bindingSpec = $this->extractBindingSpec($data);
|
||||
$validationRuleSpecs = $this->extractValidationRuleSpecs($data);
|
||||
|
||||
$this->assertNoConditionalCycle($schema, null, $data['conditional_logic'] ?? null, $data['slug'] ?? null);
|
||||
|
||||
@@ -48,6 +49,10 @@ final class FormFieldService
|
||||
$this->bindingService->replaceBindings($field, [$bindingSpec]);
|
||||
}
|
||||
|
||||
if ($validationRuleSpecs !== null) {
|
||||
$this->validationRuleService->replaceRules($field, $validationRuleSpecs);
|
||||
}
|
||||
|
||||
$this->schemaService->bumpVersion($schema);
|
||||
$field->logFieldChange('field.created');
|
||||
|
||||
@@ -67,6 +72,9 @@ final class FormFieldService
|
||||
$rawBinding = $bindingProvided ? $data['binding'] : null;
|
||||
$bindingSpec = $bindingProvided ? $this->extractBindingSpec($data) : null;
|
||||
|
||||
$validationRulesProvided = array_key_exists('validation_rules', $data);
|
||||
$validationRuleSpecs = $validationRulesProvided ? $this->extractValidationRuleSpecs($data) : null;
|
||||
|
||||
$currentBindingShape = $this->bindingService->toJsonShape($field->bindings()->first());
|
||||
|
||||
if ($bindingProvided && $this->bindingChanged($currentBindingShape, $rawBinding)) {
|
||||
@@ -91,6 +99,10 @@ final class FormFieldService
|
||||
$this->bindingService->replaceBindings($field, $bindingSpec === null ? [] : [$bindingSpec]);
|
||||
}
|
||||
|
||||
if ($validationRulesProvided) {
|
||||
$this->validationRuleService->replaceRules($field, $validationRuleSpecs ?? []);
|
||||
}
|
||||
|
||||
$this->schemaService->bumpVersion($schema);
|
||||
|
||||
$field->logFieldChange('field.updated', [
|
||||
@@ -110,6 +122,36 @@ final class FormFieldService
|
||||
return $field->refresh();
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract the `validation_rules` key from the request data array and
|
||||
* return it as the service-layer spec list. The JSON column is no
|
||||
* longer written (WS-5b commit 3) — writes go through
|
||||
* `FormFieldValidationRuleService::replaceRules` after the FormField
|
||||
* row is created/updated.
|
||||
*
|
||||
* Returns `null` when the key was absent (no change requested), or an
|
||||
* empty list when the caller explicitly cleared rules. Callers
|
||||
* distinguish via `array_key_exists('validation_rules', $data)`
|
||||
* BEFORE invoking this helper.
|
||||
*
|
||||
* @param array<string, mixed> $data
|
||||
* @return list<array<string, mixed>>|null
|
||||
*/
|
||||
private function extractValidationRuleSpecs(array &$data): ?array
|
||||
{
|
||||
if (! array_key_exists('validation_rules', $data)) {
|
||||
return null;
|
||||
}
|
||||
$raw = $data['validation_rules'];
|
||||
unset($data['validation_rules']);
|
||||
if (! is_array($raw)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
/** @var list<array<string, mixed>> $raw */
|
||||
return array_values($raw);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array<string, mixed> $data
|
||||
* @return array{target_entity:string,target_attribute:string,mode:string,sync_direction?:?string}|null
|
||||
|
||||
Reference in New Issue
Block a user