3

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

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

但是 @Expose 注释只能对属性起作用。

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

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

4

2 回答 2

3

您可以使用虚拟属性将函数返回的值作为虚拟属性返回,您可以在http://jmsyst.com/libs/serializer/master/reference/annotations#virtualproperty中找到更多信息

/**
 *
 * @VirtualProperty()
 * @SerializedName("fullName")
 */
public function getName()
{
    // return name;
}

因此,当 this 对象被序列化时,它将返回一个具有 fullName 属性的对象,该属性是 getName 函数返回的值。

于 2015-03-08T17:26:33.907 回答
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();
}

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

于 2013-07-19T04:58:12.937 回答