Geben Sie JSON mit dem Joomla Framework zurück

11

Ich habe begonnen, eine Webanwendung mit dem Joomla Framework zu erstellen . Es besteht aus einer einfachen Webseite, die in einem iFrame zusammen mit einer API angezeigt wird, mit der der Inhalt mit AJAX aktualisiert wird.

Ich folgte den Erste Schritten mit Composer und Joomla! Artikel und haben die Framework App in Betrieb. Ich habe die Standard-HTML-Ausgabe so angepasst, dass sie für meinen iFrame funktioniert, und die API gestartet. Ich habe News als Vorlage verwendet und einen Controller, ein Modell, eine Tabelle und eine Ansicht für meine API erstellt, die alle hervorragend funktionieren. Ich habe dann eine sehr einfache Twig-Vorlage erstellt, die eine JSON-Darstellung meiner Daten wie folgt zurückgibt:

{{ items|json_encode|raw }}

So weit so gut, aber ich bekomme diesen Header zurückgegeben, was bei der Verwendung von AJAX mit jQuery zu Problemen führen wird:

Content-Type:text/html; charset=utf-8

Ich dachte, es wäre ein einfacher Fall, dies hinzuzufügen, aber egal wo ich es platziere, es ändert nichts an dem zurückgegebenen Header:

$this->app->setHeader('Content-Type', 'application/json', true);

Ich weiß, dass setHeader so funktioniert, als würde ich den Namen ändern. Ich sehe, dass der neue Header zurückgegeben wird, sodass ich davon ausgehe, dass er später in der Ausführung überschrieben wird.

Meine Frage ist also, gehe ich das richtig an? Meine Ansicht erweitert DefaultHtmlView, was sich falsch anfühlt. Soll ich eine DefaultJsonView erstellen? Wie kann ich den richtigen Inhaltstyp festlegen oder gibt es einen besseren Ansatz für die Rückgabe von JSON?

Jede Hilfe, die gegeben werden kann, wie das Joomla Framework am besten zum Erstellen einer API verwendet werden kann, wird sehr geschätzt.

Joe P.
quelle

Antworten:

6

Ich habe endlich herausgefunden, was der "richtige" Weg ist, dies zu tun. Selbst wenn ich sendHeaders verwendet habe, wurde der zusätzliche Inhaltstyp hinzugefügt und dieser wurde zurückgegeben, als er später hinzugefügt wurde.

Ich folgte dem Code und AbstractWebApplication.php setzt die Header mit dieser Zeile:

// Send the content-type header.
$this->setHeader('Content-Type', $this->mimeType . '; charset=' . $this->charSet);

So konnte ich meinen eigenen mimeType definieren, indem ich dies in meinem Code verwendete:

$this->app->mimeType = 'application/json';

Jetzt wird der richtige Header zurückgegeben und jQuery versteht die Ausgabe als JSON!

Joe P.
quelle
3

Ich habe ein wenig gegraben, aber ich sehe das Problem

https://github.com/joomla-framework/application/blob/master/src/AbstractWebApplication.php

Wenn Sie sich die Funktion setHeader ansehen, wird der Header noch nicht gesetzt, sondern nur "fertig".

Was Sie also tun müssen, ist einfach

$this->app->setHeader('Content-Type', 'application/json', true)->sendHeaders();

Die zusätzliche Funktion sendHeaders()kann verkettet werden, damit Sie die Header festlegen und nicht nur "vorbereiten" können.

Da die exit;Funktion sendHeaders höchstwahrscheinlich verwendet wird , um eine weitere Ausführung zu verhindern und den JSON auszugeben, wird sie höchstwahrscheinlich nicht ausgeführt.

Jordan Ramstad
quelle
Danke für Ihren Vorschlag. Selbst wenn ich sendHeaders verwendet habe, wurde der Inhaltstyp leider immer noch überschrieben. Ich habe versucht, exit zu verwenden, aber dann habe ich keine Ausgabe erhalten, da die Vorlage nicht gerendert wurde. Ich habe eine Lösung gefunden, die ich als Antwort gepostet habe.
Joe P
Nun, ich werde eine weitere Lösung hinzufügen, damit meine auch für jeden funktioniert, der sie benötigt. Wenn Sie es verwenden exit, sollte es verhindern, dass etwas mehr ausgeführt wird, und es einfach so ausgeben, wie es derzeit ist. Ihre Antwort scheint jedoch viel besser zu sein.
Jordan Ramstad