2016-05-08 3 views
0

私は実際にWill DurandのHateoasBundleでSymfony2を使用しています。Symfony2 Hateoas - 私の埋め込みリソースは、シリアル化されたデータに2回表示されます

私は2つのエンティティUserとBlogArticleを持っています。 BlogArticleには、ManyToOneリレーションを持つ「user」プロパティが含まれています。ここで

class BlogArticle implements ResourceInterface 
{ 
    /** 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * ORM\Column(name="user_id", type="integer", nullable=false) 
    * 
    * @ORM\ManyToOne(targetEntity="Kazooi\ApiBundle\Entity\User", fetch="EAGER") 
    * @ORM\JoinColumn(name="user_id", nullable=false) 
    */ 
    private $user; 

    ... 
} 

私のファイルの私のシリアル化されたデータである "Entity.BlogArticle.ymlは":

Kazooi\ApiBundle\Entity\BlogArticle: 
    exclusion_policy: none 
    relations: 
     - 
      rel: self 
      href: 
       route: kazooi_api_blog_article_show 
       parameters: 
        id: expr(object.getId()) 
       absolute: true 
     - 
      rel: user 
      href: 
       route: kazooi_api_user_show 
       parameters: 
        id: expr(object.getUser()) 
       absolute: true 
      embedded: 
       content: expr(object.getUser()) 
      exclusion: 
       exclude_if: expr(object.getUser() === null) 

結果は次のとおりです。

{ 
    "id": 1, 
    "user": { 
    "id": 1, 
    "username": "coolfarmer", 
    "username_canonical": "coolfarmer", 
    "email": "[email protected]", 
    "email_canonical": "[email protected]", 
    "deleted": false, 
    "_links": { 
     "self": { 
     "href": "http://api.kazooi.dev/1.0/users/1" 
     } 
    } 
    }, 
    "title": "Ouverture de Kazooi", 
    "message": "Lorém ipsum dolor sit amet, consectetur adipisicing elit", 
    "date": "2016-02-24T00:00:00+0000", 
    "tags": "one, two, three", 
    "deleted": false, 
    "_links": { 
    "self": { 
     "href": "http://api.kazooi.dev/1.0/blog/articles/1" 
    }, 
    "user": { 
     "href": "http://api.kazooi.dev/1.0/users/1" 
    } 
    }, 
    "_embedded": { 
    "user": { 
     "id": 1, 
     "username": "coolfarmer", 
     "username_canonical": "coolfarmer", 
     "email": "[email protected]", 
     "email_canonical": "[email protected]", 
     "deleted": false, 
     "_links": { 
     "self": { 
      "href": "http://api.kazooi.dev/1.0/users/1" 
     } 
     } 
    } 
    } 
} 

だから、問題はそのユーザデータであります(教義の関係ManyToOneのために)ユーザのプロパティに、そして私のHateoas関係定義のために_embeddedに現れます。

これは正常ですか?私が間違ってやっていることや理解が間違っている。 私は結果が同じであってはならないが、データではなくユーザプロパティが "1"に等しいはずであることを強くお勧めします。

PS:LAZYまたはEXTRA LAZYのエンティティは結果を変更しません。

ありがとうございました。

答えて

0

docsに記載されているとおり、重複を避けるために埋め込みプロパティを除外する必要があります。そのまま使用すると、データを保存したい場合は

Kazooi\ApiBundle\Entity\BlogArticle: 
    exclusion_policy: none 
    relations: 
     ... 
     - 
      rel: user 
      href: 
       route: kazooi_api_user_show 
       parameters: 
        id: expr(object.getUser()) 
       absolute: true 
      embedded: 
       content: expr(object.getUser()) 
      exclusion: 
       exclude_if: expr(object.getUser() === null) 
    properties: 
     user: 
      exclude: true 

_embeddedを取り除く:あなたは_embeddedの下にオブジェクトを保存したい場合

だから、あなたはuserプロパティを除外したいですあなたは教義を使用しているのであれば_embedded

Kazooi\ApiBundle\Entity\BlogArticle: 
    exclusion_policy: none 
    relations: 
     ... 
     - 
      rel: user 
      href: 
       route: kazooi_api_user_show 
       parameters: 
        id: expr(object.getUser()) 
       absolute: true 
      exclusion: 
       exclude_if: expr(object.getUser() === null) 
+0

は全く役に立たない:一​​部は、単に関係からembeddedキーを削除します。一部の呼び出しで、hateoasリゾルバをOFFに設定する方法はありますか?コンセプトは素晴らしいですが、コールごとにリゾルバが100%解決すると、パフォーマンスに影響があります。 – coolfarmer

+0

[groups](http://jmsyst.com/libs/serializer/master/cookbook/exclusion_strategies#creating-different-views-of-your-objects)を使用して、プロパティ/リレーションを含める/除外するかどうかを管理できますそれがあなたが意味するものなら、要求。また、 'Hateoas'は' JMSSerializer'の拡張版なので、 'Hateoas'でも動作します。 –

関連する問題