2

我正在开发Web服务的RESTful API。我需要公开一些不属于实体本身的属性。将定制属性添加到序列化对象

例如我有一个Pizza实体对象,它具有它自己的sizename属性。我与FOSRestBundleJMSSerializer输出它以JSON格式。我已经为此实体设置了属性注释,以通过序列化组来显示所需的属性,并且它工作得很好。

但我要补充一点,不属于实体本身的一些属性。例如,我希望我的pizza拥有由某个PizzaService::isFresh(Pizza $pizza)服务确定的属性:isFresh。我该怎么做呢?

  • 我是否应该为序列化过程注入一些额外的逻辑(如果是的话)?
  • 我应该创建,我想从原来的实体以及附加外部属性公开性质的包装实体?
  • 我应该添加属性isFresh到原来Pizza实体和系列化之前控制器填充吗?
  • 我是否应该返回独立于实体数据的附加数据(例如,在兄弟JSON属性中)?

换句话说:什么是解决这个问题的最佳做法是什么?你能提供一些例子吗?谢谢。

回答

0

我deci ded创建我自己的类来序列化一个实体。

这里的例子:

class PizzaSerializer implements ObjectSerializerInterface 
{ 
    /** @var PizzaService */ 
    protected $pizzaService; 

    /** 
    * @param PizzaService $pizzaService 
    */ 
    public function __construct(PizzaService $pizzaService) 
    { 
     $this->pizzaService = $pizzaService; 
    } 

    /** 
    * @param Pizza $pizza 
    * @return array 
    */ 
    public function serialize(Pizza $pizza) 
    { 
     return [ 
      'id'  => $pizza->getId(), 
      'size' => $pizza->getSize(), 
      'name' => $pizza->getName(), 
      'isFresh' => $this->pizzaService->isFresh($pizza), 
     ]; 
    } 
} 

你只需要配置DC注入PizzaService到对象序列化,然后就这样称呼它从控制器:

$pizza = getPizzaFromSomewhere(); 

$pizzaSerializer = $this->get('serializer.pizza'); 

return $pizzaSerializer->serialize($pizza); 

对象序列化器将返回可容易地转化为JSONXMLYAML或任何阵列其他格式通过使用真正的序列化器,如JMS Serializer。如果您这样配置,FOSRestBundle会自动执行此操作。

2

我认为你可以做到这一点与VirtualProperty注释:

/** 
* @JMS\VirtualProperty 
* @return boolean 
*/ 
public function isFresh(){ 
    ... 
} 

编辑:与访问器注释

/** @Accessor(getter="getIsFresh",setter="setIsFresh") */ 
private $isFresh; 

// ... 
public function getIsFresh() 
{ 
    return $this->isFresh; 
} 

public function setIsFresh($isFresh) 
{ 
    $this->isFresh= $isFresh; 
} 

在你的控制器中的另一个解决方案,调用setIsFresh方法

(见http://jmsyst.com/libs/serializer/master/reference/annotation

+0

这个问题也是关于这个虚拟财产依赖于服务,似乎这只是答案的一部分。也许你可以设想一个方法来实现呢? – kix

+0

是的,你有权利。我认为“我应该将属性isFresh添加到原始Pizza实体并在序列化之前在控制器中填充?”是更好的解决方案。为此,我使用Accessor注释添加另一种方式 – griotteau

+0

嘿,谢谢你的回答。你为什么认为这种方法更好?其他方法的缺点是什么?你在实践中实现了这个设计吗? –