如何使用FosRestBundle公开函数结果?

时间:2013-07-19 04:36:29

标签: rest symfony fosrestbundle

我正在使用带有FosRestBundle的Symfony2为我们的系统开发REST API。 FosRestBundle是一个非常好的工具,但似乎有一个限制:只有属性(priviate,protected和public)可以暴露给API。

我想公开一个基于另外两个字段计算的派生属性(例如全名= firstName + lastName)以及描述关系的属性(例如产品的类别名称而不是a的类别ID)产品)

但是@Expose注释只能用于属性。

我已经尝试创建一个虚拟属性,在构造函数中设置该属性(在创建新属性时有效),在Doctrine生命周期中设置postLoad事件处理程序(在从数据库加载时工作)并且它正在工作。但我不喜欢这种方法,因为它会产生开销和额外的编码,即使API没有使用Entity类。

我想知道是否有更好的方法来实现这一目标。

2 个答案:

答案 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();
}

是的,仍然需要一个虚拟属性,但你可以将它设为私有,它比我之前尝试过的方法要好得多。我希望这可以节省一些时间。