Skip to content

[Hoch] EntityMerger: #[Ignore] wirksam machen und falsy Werte korrekt mergen#531

Open
maltehuebner wants to merge 1 commit into
mainfrom
fix/entity-merger-ignore-and-falsy
Open

[Hoch] EntityMerger: #[Ignore] wirksam machen und falsy Werte korrekt mergen#531
maltehuebner wants to merge 1 commit into
mainfrom
fix/entity-merger-ignore-and-falsy

Conversation

@maltehuebner

Copy link
Copy Markdown
Contributor

Behebt #523 (die beiden Korrektheits-Bugs; die breitere Mass-Assignment-Frage siehe unten).

Zwei Bugs in EntityMerger::merge()

1. #[Ignore] war wirkungslos

foreach ($reflectionProperty->getAttributes(Ignore::class) as $attr) {
    if ($attr instanceof Ignore) { return false; }   // immer false
}

getAttributes() liefert ReflectionAttribute-Wrapper, nie Ignore-Instanzen — der Check schlug nie an, jede Property galt als exponiert. Neu: Property ist exponiert, wenn sie kein #[Ignore] trägt ([] === getAttributes(Ignore::class)).

2. Falsy-Werte wurden verworfen

if ($newValue) { ... }   // verwirft 0, '', false

Damit ließ sich z. B. altitude = 0 (Meereshöhe) oder das Leeren eines Feldes nicht setzen. Neu: null !== $newValue — nur nicht gesetzte (null-)Felder werden übersprungen, was die korrekte Partial-Update-Semantik ist.

Tests

tests/Air/Util/EntityMerger/EntityMergerTest.php — 4 Fälle: non-null kopieren, null überspringen, falsy (0/'') kopieren, #[Ignore] respektieren. Gesamte Unit-Suite grün (125 Tests).

Verbleibend (nicht in diesem PR)

Die eigentliche Mass-Assignment-Lücke (stationCode, provider etc. sind nicht #[Ignore], weil sie beim Anlegen via PUT deserialisiert werden müssen) lässt sich nicht über #[Ignore] lösen, ohne das Anlegen zu brechen. Sie wird über die API-Authentifizierung (#522, PR #530) abgedeckt; eine saubere Dauerlösung wäre eine explizite Allowlist mutierbarer Felder bzw. ein separates Update-DTO.


🤖 Generated with Claude Code

Zwei Bugs in EntityMerger::merge():

1. isPropertyExposed() prüfte `$attr instanceof Ignore`, doch getAttributes()
   liefert ReflectionAttribute-Objekte – nie Ignore-Instanzen. Der Check war
   immer false, #[Ignore] damit wirkungslos. Jetzt: Property ist exponiert,
   wenn sie KEIN #[Ignore]-Attribut trägt.

2. `if ($newValue)` verwarf alle falsy Werte (0, '', false), z. B. altitude=0
   auf Meereshöhe oder das Leeren eines Feldes. Jetzt: `null !== $newValue`,
   d. h. nur echte null-Werte (nicht gesetzte Felder) werden übersprungen.

Unit-Tests (4 Fälle) ergänzt. Gesamte Unit-Suite grün.

Hinweis: Die breitere Mass-Assignment-Problematik (stationCode/provider sind
nicht #[Ignore], da sie beim Anlegen deserialisiert werden müssen) bleibt offen
und wird über die API-Authentifizierung (#522) bzw. eine Allowlist adressiert.

Refs #523

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant