kontekście
Znalazłem wiele pytań o częściowej odpowiedzi API z FOSRest i wszystkie odpowiedzi są oparte na opcjach JMS serializer (exlude, obejmują grupy, itp). Działa dobrze, ale staram się osiągnąć coś mniej "statycznego".FOSRestBundle: częściowa odpowiedź w zależności od atrybutów zapytał żądania
Powiedzmy mam użytkownikowi następujące atrybuty: id
username
firstname
lastname
age
sex
odzyskać to użytkownikowi końcowym GET /users/{id}
i następujący sposób:
/**
* @View
*
* GET /users/{id}
* @param integer $user (uses ParamConverter)
*/
public function getUserAction(User $user) {
return $user;
}
metoda zwraca użytkownik ze wszystkimi swoimi atrybutami.
Teraz chcę, aby umożliwić coś takiego: GET /users/{id}?attributes=id,username,sex
Pytanie
ja brakowało funkcjonalności FOSRestBUndle, JMSserializer lub SensioFrameworkExtraBundle osiągnąć to automatycznie? Adnotacja, metoda, słowo kluczowe w żądaniu lub coś innego?
W przeciwnym razie, jaki jest najlepszy sposób, aby to osiągnąć?
Kod
myślałem zrobić coś takiego:
/**
* @View
* @QueryParam(name="attributes")
*
* GET /users/{id}
*
* @param integer $user (uses ParamConverter)
*/
public function getUserAction(User $user, $attributes) {
$groups = $attributes ? explode(",", $attributes) : array("Default");
$view = $this->view($user, 200)
->setSerializationContext(SerializationContext::create()->setGroups($groups));
return $this->handleView($view);
}
i utworzyć grupę dla każdego atrybutu:
use JMS\Serializer\Annotation\Groups;
class User {
/** @Groups({"id"}) */
protected $id;
/** @Groups({"username"}) */
protected $username;
/** @Groups({"firstname"}) */
protected $firstname;
//etc
}
Wiesz, czy istnieje sposób, aby umieścić całą tę logikę w adnotacji (bezpośrednio wewnątrz @View lub wewnątrz nowej adnotacji)?Właściwie, potrzebuję wszędzie wykluczenia pól, a kod będzie ściśle identyczny w każdym punkcie końcowym. Jestem całkiem nowym użytkownikiem php i symfony, więc jeśli masz jakieś linki, to doceniam to. :) –
Jest to zdecydowanie możliwe, ale nigdy nie napisałem adnotacji, więc nie mogę ci pomóc z wytycznymi dotyczącymi implementacji, będziesz musiał sam to zbadać :) –