我正在使用带有FosRestBundle的Symfony2为我们的系统开发REST API。 FosRestBundle是一个非常好的工具,但似乎有一个限制:只有属性(priviate,protected和public)可以暴露给API。
我想公开一个基于另外两个字段计算的派生属性(例如全名= firstName + lastName)以及描述关系的属性(例如产品的类别名称而不是a的类别ID)产品)
但是@Expose注释只能用于属性。
我已经尝试创建一个虚拟属性,在构造函数中设置该属性(在创建新属性时有效),在Doctrine生命周期中设置postLoad事件处理程序(在从数据库加载时工作)并且它正在工作。但我不喜欢这种方法,因为它会产生开销和额外的编码,即使API没有使用Entity类。
我想知道是否有更好的方法来实现这一目标。
答案 0 :(得分:3)
您可以使用虚拟属性将函数返回的值作为虚拟属性返回,您可以在http://jmsyst.com/libs/serializer/master/reference/annotations#virtualproperty
中找到更多信息。/**
*
* @VirtualProperty()
* @SerializedName("fullName")
*/
public function getName()
{
// return name;
}
所以当这个对象被序列化时,它将返回一个带有fullName属性的对象,该属性是getName函数返回的值。
答案 1 :(得分:1)
在寻找答案之后,我找到了一个解决方案,以及@Expose注释,JMS序列化器附带了另一个注释:@Accessor
/**
* @REST\Accessor(getter="getName")
* @REST\Expose
*/
private $name;
/**
* Return a name of the license
*
* @return string
*/
public function getName()
{
return $this->getProduct()->getName();
}
是的,仍然需要一个虚拟属性,但你可以将它设为私有,它比我之前尝试过的方法要好得多。我希望这可以节省一些时间。