2017-09-22 80 views
6

czytam this article o nadrzędne grupy właściwości dziecko:JMS serializer Zastępowanie grupy w FOSRestBundle

use JMS\Serializer\SerializationContext; 

$context = SerializationContext::create()->setGroups(array(
    'Default', // Serialize John's name 
    'manager_group', // Serialize John's manager 
    'friends_group', // Serialize John's friends 

    'manager' => array(// Override the groups for the manager of John 
     'Default', // Serialize John manager's name 
     'friends_group', // Serialize John manager's friends. If you do not override the groups for the friends, it will default to Default. 
    ), 

    'friends' => array(// Override the groups for the friends of John 
     'manager_group' // Serialize John friends' managers. 

     'manager' => array(// Override the groups for the John friends' manager 
      'Default', // This would be the default if you did not override the groups of the manager property. 
     ), 
    ), 
)); 
$serializer->serialize($john, 'json', $context); 

W FOSRestBundle Używam @View adnotacji z właściwością serializerGroups:

/** 
* @Rest\Get("/api/users/{id}", name="api_get_user") 
* @Rest\View(serializerGroups={"Default", "detail", "friends":{"Default"}) 
*/ 
public function getAction(Request $request, User $user = null) 
{ 
    return $user; 
} 

Jak mogę nadpisać właściwości podrzędne przy użyciu tej adnotacji?

Dzięki.

Odpowiedz

3

W końcu znalazłem odpowiedź! Jeśli ktoś znajdzie lepszy i krótszy sposób, z adnotacjami, mogę nagrodzić nagrodę (ponieważ nie mogę jej odzyskać).

Jedynym sposobem na przesłonięcie grup zagnieżdżonych właściwości jest uzyskanie z podglądu kontekstu serializatora i ustawienie grup z tego widoku. Oto ona:

/** 
* @Rest\Get("/api/users/profile", name="api_get_profile") 
*/ 
public function profileAction(Request $request) 
{ 
    $user = $this->getUser(); 

    // sets different groups for nested properties 
    $view = $this->view($user); 
    $view->getContext()->setGroups(array(
     'Default', 
     'user_detail', 
     'user_profile', 
     'friends' => array(
      'Default', 
     ) 
    )); 

    return $this->handleView($view); 
} 

ten sposób mój profileAction zwróci użytkownikowi wszystkich user_detail i user_profile grup, ale rzeczy w nieruchomości friends, która zawiera tablicę Użytkownika, po prostu zawierać właściwości zdefiniowane w Default grupa.

Jest to wynikiem:

{ 
    "id": 532, 
    "username": "someuser", 
    "email": "[email protected]", 
    "enabled": true, 
    "last_login": "2017-11-10T09:45:51+01:00", 
    "notification_id": "ABC", 
    "avatar_id": 3, 
    "friends": [ 
     { 
      "id": 530, 
      "username": "anotheruser", 
      "avatar_id": 5 
     }, 
     { 
      "id": 554, 
      "username": "johndoe", 
      "avatar_id": 7 
     } 
    ] 
} 

Pozdrowienia.