Ich entwickle eine Spiel-App und verwende Symfony 2.0. Ich habe viele AJAX-Anfragen an das Backend. Weitere Antworten sind die Konvertierung von Entitäten in JSON. Beispielsweise:
class DefaultController extends Controller
{
public function launchAction()
{
$user = $this->getDoctrine()
->getRepository('UserBundle:User')
->find($id);
// encode user to json format
$userDataAsJson = $this->encodeUserDataToJson($user);
return array(
'userDataAsJson' => $userDataAsJson
);
}
private function encodeUserDataToJson(User $user)
{
$userData = array(
'id' => $user->getId(),
'profile' => array(
'nickname' => $user->getProfile()->getNickname()
)
);
$jsonEncoder = new JsonEncoder();
return $jsonEncoder->encode($userData, $format = 'json');
}
}
Und alle meine Controller tun dasselbe: Holen Sie sich eine Entität und codieren Sie einige ihrer Felder in JSON. Ich weiß, dass ich Normalisierer verwenden und alle Berechtigungen codieren kann. Was aber, wenn eine Entität Links zu einer anderen Entität gewechselt hat? Oder ist das Entitätsdiagramm sehr groß? Hast du irgendwelche Vorschläge?
Ich denke über ein Codierungsschema für Entitäten nach ... oder über das Verwenden NormalizableInterface
, um das Radfahren zu vermeiden ..,
quelle
Mit php5.4 können Sie jetzt:
Und dann anrufen
quelle
OneToMany
Beziehungen) zu funktionierenSie können automatisch in Json, Ihre komplexe Entität, codieren mit:
quelle
So vervollständigen Sie die Antwort: Symfony2 wird mit einem Wrapper um json_encode geliefert: Symfony / Component / HttpFoundation / JsonResponse
Typische Verwendung in Ihren Controllern:
Hoffe das hilft
J.
quelle
Ich fand die Lösung für das Problem der Serialisierung von Entitäten wie folgt:
in meinem Controller:
anderes Beispiel:
Sie können es sogar so konfigurieren, dass Arrays in http://api.symfony.com/2.0 deserialisiert werden
quelle
Ich musste nur das gleiche Problem lösen: JSON-Codierung einer Entität ("Benutzer") mit einer bidirektionalen Eins-zu-Viele-Zuordnung zu einer anderen Entität ("Standort").
Ich habe verschiedene Dinge ausprobiert und denke, jetzt habe ich die beste akzeptable Lösung gefunden. Die Idee war, den gleichen Code wie von David zu verwenden, aber irgendwie die unendliche Rekursion abzufangen, indem man dem Normalisierer sagt, er solle irgendwann aufhören.
Ich wollte keinen benutzerdefinierten Normalisierer implementieren, da dieser GetSetMethodNormalizer meiner Meinung nach ein guter Ansatz ist (basierend auf Reflexion usw.). Daher habe ich mich für eine Unterklasse entschieden, was auf den ersten Blick nicht trivial ist, da die Methode, mit der angegeben wird, ob eine Eigenschaft (isGetMethod) eingeschlossen werden soll, privat ist.
Aber man könnte die Normalisierungsmethode überschreiben, also habe ich an dieser Stelle abgefangen, indem ich einfach die Eigenschaft deaktiviert habe, die auf "Location" verweist - so wird die unendliche Schleife unterbrochen.
Im Code sieht es so aus:
quelle
Ich hatte das gleiche Problem und entschied mich, meinen eigenen Encoder zu erstellen, der selbst mit Rekursion fertig wird.
Ich habe Klassen erstellt, die implementiert werden
Symfony\Component\Serializer\Normalizer\NormalizerInterface
, und einen Dienst, der alle enthältNormalizerInterface
.Ein Beispiel für einen Normalisierer:
In einer Steuerung:
Der vollständige Code ist hier: https://github.com/progracqteur/WikiPedale/tree/master/src/Progracqteur/WikipedaleBundle/Resources/Normalizer
quelle
in Symfony 2.3
/app/config/config.yml
und Beispiel für Ihren Controller:
Die Probleme mit dem Feldtyp \ DateTime bleiben jedoch bestehen.
quelle
Dies ist eher ein Update (für Symfony v: 2.7+ und JmsSerializer v: 0.13. * @ Dev) , um zu vermeiden, dass Jms versucht, den gesamten Objektgraphen zu laden und zu serialisieren (oder im Falle einer zyklischen Beziehung ..)
Modell:
Innerhalb einer Aktion:
quelle
Wenn Sie Symfony 2.7 oder höher verwenden und kein zusätzliches Bundle für die Serialisierung hinzufügen möchten, können Sie auf diese Weise die Doktrinentitäten in json - seialisieren.
In meinem (gemeinsamen, übergeordneten) Controller habe ich eine Funktion, die den Serializer vorbereitet
Verwenden Sie es dann, um Entitäten in JSON zu serialisieren
Getan!
Möglicherweise müssen Sie jedoch eine Feinabstimmung vornehmen. Zum Beispiel -
quelle
Wenn Sie viele REST-API-Endpunkte in Symfony erstellen müssen, verwenden Sie am besten den folgenden Stapel von Bundles:
Wenn Sie alles richtig konfigurieren, sieht Ihr Entitätscode folgendermaßen aus:
Dann Code in der Steuerung:
Die Vorteile einer solchen Einrichtung sind:
quelle
Jetzt können Sie auch Doctrine ORM-Transformationen verwenden , um Entitäten in verschachtelte Arrays von Skalaren und zurück zu konvertieren
quelle