2016-05-08 18 views
0

Ich benutze tatsächlich Symfony2 mit HateoasBundle von Will Durand, und ich vermisse die eingebettete Ressource.Symfony2 Hateoas - Meine eingebettete Ressource erscheint zweimal in meinen serialisierten Daten

Ich habe 2 Einheiten, Benutzer und BlogArticle. BlogArticle enthält eine "user" -Eigenschaft mit einer ManyToOne-Beziehung.

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) 

Das Ergebnis ist:

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; 

    ... 
} 

Hier meine serialisierten Daten in meiner Datei "Entity.BlogArticle.yml" ist

{ 
    "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" 
     } 
     } 
    } 
    } 
} 

So ist das Problem, dass die Benutzerdaten erscheinen zweimal in der Benutzereigenschaft (wegen der Doktrinbeziehung ManyToOne) und in _embedded aufgrund meiner Hateoas-Beziehungsdefinition.

Es ist normal? Was ich falsch mache oder nicht verstehe. Ich habe mir gedacht, dass das Ergebnis sollte gleich sein, aber die Benutzereigenschaft gleich "1", nicht die Daten.

PS: Entität in LAZY oder EXTRA LAZY ändert nicht das Ergebnis.

Danke für Ihre Hilfe.

Antwort

0

Wie in der docs angegeben, müssen Sie die eingebettete Eigenschaft ausschließen, um eine Duplizierung zu vermeiden.

Also, wenn Sie das Objekt unter _embedded erhalten möchten, würden Sie die user Eigenschaft ausschließen:

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 

Wenn Sie die Daten behalten möchten, wie es ist und loszuwerden, die _embedded Teil, entfernen Sie einfach die embedded Schlüssel aus der Beziehung:

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

So _embedded völlig nutzlos ist, wenn Sie Lehre verwenden. Es gibt eine Möglichkeit, den hadoas Resolver für einige Anrufe auf OFF zu setzen. Konzept ist cool, aber wenn der Resolver 100% für jeden Anruf auflösen, wird die Leistung beeinträchtigt. – coolfarmer

+0

Sie können [groups] (http://jmsst.com/libs/serializer/master/cookbook/exclusion_strategies#creating-different-views-of-your-objects) verwenden, um zu verwalten, ob Eigenschaften/Relationen auf der Basis von/ausgeschlossen werden sollen die Bitte, wenn du das meinst. Sie arbeiten auch mit 'Hateoas', da es nur eine Erweiterung des' JMSSerializers' ist. –