JMSSerializerを使用してシリアル化とデシリアライズで単一のオブジェクトプロパティを処理したいと考えています。私たちは、このクラスを持っているSuposing:私は、タスクのインスタンスを返すしたいJMSSerializer(単一のプロパティを扱う)で入力フィールドと出力フィールドをフォーマットする
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];
}
}
は(FOSRestBundleを使用して)REST APIを投げました。問題は、$status
属性の生の値ではなく、「ラベル」の値を返すことです。
Task:
exclusion_policy: ALL
properties:
status:
expose: true
type: string
「保留中」または「オーバー」(getStatusLabel
を使用して)私のシリアライズされたオブジェクトでのJMSシリアライザは、0または1である生の値を考慮し、私は送信したい:このような私のシリアル化の設定
。また、逆シリアル化の逆作業を実行します(getStatusFromLabel
を使用)。
私はvirtual_properties
について教えましたが、それはセリシング方向でのみ機能します。
私はこのように見ているカスタムハンドラを試してみました:
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);
}
しかし、それは明らかに動作しません!
どのように私のカスタムgetterをserilizationとdeserializationの両方の方向で呼び出すことができますか?
ありがとうございます。 @all 'class'の完全修飾名はバックスラッシュの先頭にない(デバッグするのが難しい)必要があると考えてください。 – ownking