feat(form-builder): form_field_bindings table + polymorphic owner + cascade observer
WS-5a commit 1 of 4 per ARCH-CONSOLIDATION-ADDENDUM-2026-04-24 Q3. Creates the relational home for what was form_fields.binding JSON and form_field_library.default_binding JSON. Owner discriminator is polymorphic morph (owner_type/owner_id) — the pattern the rest of WS-5 (5b validation_rules, 5d options) will reuse. Migration backfills rows from both JSON sources in a single transaction and is genuinely reversible (rollback reconstructs the JSON). Old columns remain in place until commit 3 has switched all readers. Pattern B (binding=null) is represented by absence of row. mode enum covers entity_owned / mirrored only. Cascade on owner delete via observer — bindings are physical state, not historical audit. FormFieldBindingScope enforces multi-tenancy via UNION over both owner chains (form_field → schema → org OR form_field_library → org) — Q2's declarative tenantScopeStrategy() can't walk morph parents. Tests: migration forward/back, morph relation, cascade observer, scope isolation, enum coverage. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -48,6 +48,7 @@ use App\Models\VolunteerAvailability;
|
||||
use App\Events\FormBuilder\FormSubmissionSubmitted;
|
||||
use App\Listeners\FormBuilder\SyncTagPickerSelectionsOnSubmit;
|
||||
use App\Listeners\FormBuilder\TriggerPersonIdentityMatchOnFormSubmit;
|
||||
use App\Observers\FormBuilder\FormFieldBindingsCascadeObserver;
|
||||
use App\Observers\FormBuilder\FormSubmissionObserver;
|
||||
use App\Observers\FormBuilder\FormValueObserver;
|
||||
use App\Observers\PersonObserver;
|
||||
@@ -94,6 +95,11 @@ class AppServiceProvider extends ServiceProvider
|
||||
FormValue::observe(FormValueObserver::class);
|
||||
\App\Models\FormBuilder\FormSubmission::observe(FormSubmissionObserver::class);
|
||||
|
||||
// Cascade binding rows on owner delete (WS-5a). Bindings are physical
|
||||
// state; deleted on soft-delete as well as hard-delete of the owner.
|
||||
FormField::observe(FormFieldBindingsCascadeObserver::class);
|
||||
FormFieldLibrary::observe(FormFieldBindingsCascadeObserver::class);
|
||||
|
||||
// ARCH §31.10 — FORM-02 TAG_PICKER sync listener.
|
||||
\Illuminate\Support\Facades\Event::listen(
|
||||
FormSubmissionSubmitted::class,
|
||||
|
||||
Reference in New Issue
Block a user