2

Web サービス用の RESTful API を開発しています。また、エンティティ自体に属さないいくつかのプロパティを公開する必要があります。

たとえば、Pizzaエンティティ オブジェクトがあり、それには独自のsizeプロパティがありnameます。FOSRestBundleJMSSerializerでJSON形式で出力しています。このエンティティのプロパティ注釈を設定して、シリアル化グループを介して必要なプロパティを公開しましたが、うまく機能しています。

しかし、エンティティ自体に属さないプロパティをいくつか追加する必要があります。たとえば、pizzaプロパティが必要です。isFreshこれは、何らかのPizzaService::isFresh(Pizza $pizza)サービスによって決定されます。どうすればいいですか?

  • シリアル化プロセスに追加のロジックを挿入する必要がありますか (そうであれば、どのように)?
  • 元のエンティティから公開したいプロパティと追加の外部プロパティを含むラッパー エンティティを作成する必要がありますか?
  • isFreshシリアライゼーションの前に、元のPizzaエンティティにプロパティを追加してコントローラーに入力する必要がありますか?
  • エンティティ データとは独立した追加データを返す必要がありますか (たとえば、兄弟の JSON プロパティで)。

つまり、この問題に関するベスト プラクティスは何ですか? 例を挙げていただけますか?ありがとうございました。

4

2 に答える 2

0

エンティティをシリアル化する独自のクラスを作成することにしました。

次に例を示します。

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 SerializerFOSRestBundleそのように構成した場合、これは自動的に行われます。

于 2014-04-11T16:35:38.680 に答える