Ich mag ein einzelnes Objekteigenschaft auf Serialisierung und Deserialisierung mit JMSSerializer zu handhaben. Suposing wir diese Klasse haben:Format Eingabe- und Ausgabefelder mit JMSSerializer (Griff einzelne Eigenschaft)
class Task {
const STATUS_PENDING = 0;
const STATUS_OVER = 1;
protected $status;
/* getter and setter */
public function getStatusLabel()
{
return ['pending', 'over'][$this->getStatus()];
}
public static function getStatusFromLabel($label)
{
return [
'pending' => self::STATUS_PENDING,
'over' => self::STATUS_OVER
][$label];
}
}
Ich mag würde Instanzen Aufgabe zurückzukehren, um eine REST-API warf (mit FOSRestBundle). Das Problem ist, dass ich nicht den Rohwert des Attributs $status
zurückgeben möchte, sondern den "Label" -Wert.
konfigurieren meine Serialisierung wie folgt aus:
Task:
exclusion_policy: ALL
properties:
status:
expose: true
type: string
Der JMS-Serializer hält den Rohwert, die 0 oder 1 ist, aber ich möchte schicken ‚offen‘ oder ‚über‘ in meinem serialisierte Objekt (mit getStatusLabel
) . Und machen Sie den umgekehrten Job bei der Deserialisierung (mit getStatusFromLabel
).
Ich dachte über eine virtual_properties
, aber es funktioniert nur in Serilisation Richtung.
Ich habe versucht, mit einem benutzerdefinierten Handler wie folgt aussehen:
class TaskHandler implements SubscribingHandlerInterface
{
public static function getSubscribingMethods()
{
return [
[
'direction' => GraphNavigator::DIRECTION_SERIALIZATION,
'format' => 'json',
'type' => 'Task',
'method' => 'serializeToArray',
]
];
}
public function serializeToArray(JsonSerializationVisitor $visitor, Task $task, array $type, Context $context)
{
$task->setStatus($task->getStatusLabel());
return $visitor->getNavigator()->accept($task, $type, $context);
}
Aber es funktioniert natürlich nicht!
Wie kann ich meine benutzerdefinierten Getters sowohl in Serilisierung als auch in Deserialisierung aufrufen?
Vielen Dank für die Freigabe. @all Beachten Sie, dass der vollständig qualifizierte Name von 'class' ohne führenden Backslash (schwer zu debuggen) sein muss. – ownking