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

嘿,謝謝你的回答。你爲什麼認爲這種方法更好?其他方法的缺點是什麼?你在實踐中實現了這個設計嗎? –