40

私は通常、JMS シリアライザー バンドルを使用してシリアル化するエンティティを持っています。エンティティ自体には存在しないが、いくつかのデータベースクエリで収集されるいくつかのフィールドをシリアライゼーションに追加する必要があります。

私のアイデアは、カスタム オブジェクトを作成し、フィールドにエンティティ フィールドを入力して、カスタム オブジェクトを追加することでした。しかし、これは、クラスのすべてのバリエーション (私は多くのシリアライゼーション グループを使用しています) に対して行うには、少しトリッキーで費用がかかるようです。

これを行うためのより良い/標準的な方法はありますか? 工場を使う?連載前後のイベント?

シリアライゼーションをリッスンし、エンティティ タイプとシリアライゼーション グループを確認して、カスタム フィールドを追加できますか? ただし、エンティティごとにクエリを作成する代わりに、関連するエンティティのすべてのデータを収集してから追加する方がよいでしょう。どんな助けでも大歓迎です

4

6 に答える 6

11

元の質問にさらに答えるには。一部のシリアル化されたグループの追加データを制限する方法を次に示します (この例some_dataでは、グループを使用していない場合にのみ追加されlistます:

public function onPostSerializeSomeEntityJson(ObjectEvent $event) {

    $entity = $event->getObject();

    if (!in_array('list', (array)$event->getContext()->attributes->get('groups'))) {

        $event->getVisitor()->addData('user_access', array(
            'some_data' => 'some_value'
        ));
    }
}

(array)$event->getContext()->attributes->get('groups')使用されたシリアル化されたグループの配列が含まれています。

于 2014-08-24T23:04:00.197 に答える
6

受け入れられた回答は、訪問者が から派生した場合にのみ機能し\JMS\Serializer\GenericSerializationVisitorます。つまり、JSON では機能しますが、XML では失敗します。

XML に対応するメソッドの例を次に示します。ビジター オブジェクトがサポートするインターフェイスを調べて、適切に動作します。JSON と XML の両方のシリアル化されたオブジェクトに link 要素を追加する方法を示しています...

public function onPostSerialize(ObjectEvent $event)
{
    //obtain some data we want to add
    $link=array(
        'rel'=>'self',
        'href'=>'http://example.org/thing/1',
        'type'=>'application/thing+xml'
    );

    //see what our visitor supports...
    $visitor= $event->getVisitor();
    if ($visitor instanceof \JMS\Serializer\XmlSerializationVisitor)
    {
        //do XML things
        $doc=$visitor->getDocument();

        $element = $doc->createElement('link');
        foreach($link as $name => $value) {
            $element->setAttribute($name, $value);
        }
        $doc->documentElement->appendChild($element);
    } elseif ($visitor instanceof \JMS\Serializer\GenericSerializationVisitor)
    {
        $visitor->addData('link', $link);
    }


}
于 2014-10-14T08:44:02.857 に答える