Renvoyer JSON en utilisant Joomla Framework

11

J'ai commencé à créer une application Web à l'aide de Joomla Framework . Il se compose d'une simple page Web qui sera affichée dans un iFrame avec une API qui sera utilisée pour mettre à jour le contenu avec AJAX.

J'ai suivi les premiers pas avec Composer et Joomla! article et avoir l' application Framework opérationnelle. J'ai personnalisé la sortie HTML par défaut pour qu'elle fonctionne avec mon iFrame et j'ai démarré l'API. J'ai utilisé News comme modèle et créé un contrôleur, un modèle, une table et une vue pour mon API, qui fonctionnent tous très bien. J'ai ensuite créé un modèle Twig très simple qui renvoie une représentation JSON de mes données comme ceci:

{{ items|json_encode|raw }}

Jusqu'ici tout va bien mais je reçois cet en-tête retourné qui causera des problèmes lors de l'utilisation d'AJAX avec jQuery:

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

Je pensais que ce serait un cas simple d'ajouter cela, mais peu importe où je le mets, cela ne change pas l'en-tête qui est retourné:

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

Je sais que setHeader fonctionne comme si je modifiais le nom, je vois le nouvel en-tête renvoyé, je suppose donc qu'il est écrasé plus tard dans l'exécution.

Donc ma question est, est-ce que je vais y aller dans le bon sens? Ma vue étend DefaultHtmlView qui semble incorrect, dois-je créer un DefaultJsonView? Comment puis-je définir le type de contenu correct ou existe-t-il une meilleure approche pour renvoyer JSON?

Toute aide qui pourrait être donnée sur la meilleure façon d'utiliser Joomla Framework pour créer une API sera grandement appréciée.

Joe P
la source

Réponses:

6

J'ai finalement trouvé ce qui semble être la "bonne" façon de procéder. Même si j'utilisais sendHeaders, le Content-Type supplémentaire était ajouté et renvoyé tel qu'il a été ajouté plus tard.

J'ai suivi le code et AbstractWebApplication.php définit les en-têtes avec cette ligne:

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

J'ai donc pu définir mon propre mimeType en utilisant ceci dans mon code:

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

Maintenant, l'en-tête correct est renvoyé et jQuery comprend la sortie comme JSON!

Joe P
la source
3

A pris un peu de fouille mais je vois le problème

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

Si vous regardez la fonction setHeader, elle ne définit pas encore l'en-tête, elle ne fait que la "préparer"

Donc, ce que vous devez faire est simple

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

La fonction supplémentaire sendHeaders()peut être chaînée pour vous permettre de définir les en-têtes, pas seulement de les «préparer».

Avec la plus probable utilisation exit;pour empêcher toute autre exécution et sortie du JSON, la fonction sendHeaders n'est probablement pas en cours d'exécution.

Jordan Ramstad
la source
Merci pour votre suggestion. Malheureusement, même pourquoi j'ai utilisé sendHeaders, le Content-Type a toujours été écrasé. J'ai essayé d'utiliser exit mais je n'ai obtenu aucune sortie car le modèle ne s'était pas rendu. J'ai trouvé une solution que j'ai postée comme réponse.
Joe P
Eh bien, j'ajouterai une autre solution, juste pour que la mienne fonctionne aussi bien pour quiconque pourrait en avoir besoin. Si vous l'utilisez, exitcela devrait empêcher que quelque chose de plus s'exécute et le restituer tel qu'il est actuellement. Votre réponse semble cependant bien meilleure.
Jordan Ramstad