【发布时间】:2013-12-19 17:01:33
【问题描述】:
我想使用 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];
}
}
我想返回一个 REST API 的 Task 实例(使用 FOSRestBundle)。问题是我不想返回 $status 属性的原始值,而是“标签”值。
像这样配置我的序列化:
Task:
exclusion_policy: ALL
properties:
status:
expose: true
type: string
JMS 序列化程序会考虑原始值 0 或 1,但我想在我的序列化对象中发送“待定”或“结束”(使用 getStatusLabel)。并在反序列化上做相反的工作(使用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?
【问题讨论】: