Ich möchte Symfony 2.8 verwenden, um ein Formular für Datenklasse zu erstellen, z. Task
wie in der Symfony docs verwendet.So ordnen Sie eine Klassenvariable in Symfony zwei Formularfeldern zu
Meine Task
Klasse verwendet ein Integer-Feld flags
, um eine Sammlung verschiedener Bool-Werte zu speichern. Zum Beispiel wird der Wert von is completed
wird als das erste Bit und is urgent
als zweites Bit gespeichert:
- Task nicht abgeschlossen und nicht dringend -> flags = 0
- Aufgabe abgeschlossen ist und nicht dringend -> flags = 1
- Aufgabe ist nicht abgeschlossen und dringend -> Flaggen = 2
- Aufgabe abgeschlossen und dringlich ist -> flags = 3
- ...
Das Problem: Wie kann das einzelne Klassenfeld auf zwei verschiedene Formularfelder und zurück abgebildet werden?
$builder
// map first bit to checkbox
->add('is_complete', CheckboxType::class, array(
...
)
)
// map second bit to selection box "normal"/"urgent"
->add('is_urgend', ChoiceType::class, array(
...
)
)
...
Was ist die richtige Lösung, um dies zu lösen? Kann dies durch eine Datentransformatoren gehandhabt werden? So weit ich weiß, kann ein Transformator ein Feld von einem in einen anderen Typ umwandeln, aber nicht ein Feld in zwei Felder. Ist das korrekt?
Die einzige Lösung, die ich bisher gefunden habe, ist die Erstellung einer Wrapper-Klasse TaskWrapper
, die keine Flags verwendet, sondern für jeden Flag-Wert verschiedene Bool-Felder anbietet. Diese Klasse könnte dann anstelle der ursprünglichen Klasse Task
an das Formular übergeben werden. Sobald das Formular übergeben wurde, kann das zurückgegebene Wrapperobjekt manuell in ein Task
Objekt zurückübersetzt werden.
Das würde funktionieren, aber es ist keine saubere Lösung. Ist das der richtige Weg oder gibt es eine bessere Lösung mit Symfony Tools?
Warum würden Sie nicht zwei verschiedene booleans speichern? Einer für "abgeschlossen" und der andere für "dringend"? –
Dies ist nur ein Beispiel, die reale Entitätsklasse verwendet das Feld 'flags', um noch mehr Werte zu speichern. Außerdem ist es an eine externe API gebunden, die ich nicht ändern kann. Daher macht die Verwendung von Flags in diesem Fall wirklich Sinn. –
Ich würde die Flags als separate Attribute speichern und eine Coder/Decoder-Klasse schreiben, um mit der externen API zu sprechen. –