5

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 をスローした Task のインスタンスを返したいと思います。$status問題は、属性の生の値ではなく、「ラベル」の値を返したくないことです。

次のようにシリアライゼーションを設定します。

Task:
    exclusion_policy: ALL
    properties:
        status:
            expose: true
            type: string

JMS シリアライザーは 0 または 1 の raw 値を考慮しますが、シリアル化されたオブジェクトで「保留中」または「オーバー」を送信したい (を使用getStatusLabel)。そして、逆シリアル化で逆の仕事をします(を使用getStatusFromLabel)。

私はaについて考えました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);
    }

しかし、それは明らかにうまくいきません!

シリアル化と逆シリアル化の両方の方向でカスタム ゲッターを呼び出すにはどうすればよいですか?

4

1 に答える 1