Kontext gefragt
ich eine Menge Fragen über Teil API-Antwort mit FOSRest gefunden und alle Antworten basieren auf den JMS-Serializer-Optionen (exlude, umfassen Gruppen, etc). Es funktioniert gut, aber ich versuche, etwas weniger "statisch" zu erreichen.FOSRestBundle: partielles Ansprechen in Abhängigkeit von Attributen in der Anfrage
Sagen wir, ich habe einen Benutzer mit den folgenden Attributen: id
username
firstname
lastname
age
sex
ich abrufen diesen Benutzer mit dem Endpunkt GET /users/{id}
und die folgende Methode:
/**
* @View
*
* GET /users/{id}
* @param integer $user (uses ParamConverter)
*/
public function getUserAction(User $user) {
return $user;
}
Die Methode liefert der Benutzer mit all seinen Attributen.
Jetzt möchte ich, so etwas erlauben: GET /users/{id}?attributes=id,username,sex
Frage
Habe ich eine Funktionalität von FOSRestBUndle, JMSserializer oder SensioFrameworkExtraBundle verpassten es automatisch zu erreichen? Eine Annotation, eine Methode, ein Schlüsselwort in der Anfrage oder etwas anderes?
Oder, was ist der beste Weg, um es zu erreichen?
-Code
Ich dachte, so etwas zu tun:
/**
* @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);
}
und eine Gruppe für jedes Attribut erstellen:
use JMS\Serializer\Annotation\Groups;
class User {
/** @Groups({"id"}) */
protected $id;
/** @Groups({"username"}) */
protected $username;
/** @Groups({"firstname"}) */
protected $firstname;
//etc
}
Wissen Sie, ob es einen Weg gibt all diese Logik in einer Anmerkung zu setzen (direkt in @View oder in eine neue Anmerkung)?Eigentlich benötige ich Felderausschlüsse überall und der Code wird in jedem Endpunkt streng identisch sein. Ich bin ziemlich neu in PHP und Symfony, also wenn Sie einige Links haben, werde ich es zu schätzen wissen. :) –
Es ist definitiv möglich, aber ich habe nie benutzerdefinierte Annotation gemacht, so kann ich Ihnen nicht wirklich mit Implementierungsrichtlinien helfen, müssen Sie diesen Teil selbst recherchieren :) –