由于实体可以有多个边界、代理对象和相关实体,因此我个人更喜欢明确指定要序列化的内容,例如:
use JsonSerializable;
class SomeEntity implements JsonSerializable
{
private $title;
private $text;
public function jsonSerialize()
{
return array(
'title' => $this->title,
'text' => $this->text,
);
}
}
然后,只需简单地使用json_encode($someEntityInstance);
。
您也可以使用JMSSerializerBundle来实现DRY。
此外,您还可以选择编写自己的序列化程序来规范化数据。
更新:
如果您想要JSON的多个表示,可以按照以下方式实现:
use JsonSerializable;
class SomeEntity implements JsonSerializable
{
protected $isList;
public function toList()
{
$this->isList = TRUE;
return $this;
}
private function jsonSerializeToList()
{
return [
}
public function jsonSerialize()
{
if( $this->isList ) {
$normalized = $this->jsonSerializeToList();
} else {
$normalized = array(
'title' => $this->title,
'text' => $this->text,
);
}
return $normalized;
}
}
而这个方法的调用方式为json_encode($someEntityInstance->toList());
。不过这种写法有点笨拙,所以我建议采用接口统一的思路。