it-swarm-es.tech

Devolver JSON usando el Marco Joomla

He comenzado a crear una aplicación web usando Joomla Framework . Consiste en una página web simple que se mostrará en un iFrame junto con una API que se utilizará para actualizar el contenido con AJAX.

Seguí el artículo Comenzando con Composer y Joomla! y tengo el Aplicación Framework en funcionamiento. He personalizado la salida HTML predeterminada para trabajar para mi iFrame y haber comenzado en la API. Utilicé News como plantilla y creé un controlador, modelo, tabla y vista para mi API que funciona muy bien. Luego creé un Twig plantilla que devuelve una representación JSON de mis datos de esta manera:

{{ items|json_encode|raw }}

Hasta ahora todo bien, pero me devuelve este encabezado que causará problemas al usar AJAX con jQuery:

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

Pensé que sería un simple caso de agregar esto, pero no importa dónde lo coloque, no cambia el encabezado que se devuelve:

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

Sé que setHeader funciona como si cambiara el nombre, veo que se devuelve el nuevo encabezado, así que supongo que se sobrescribirá más adelante en la ejecución.

Entonces mi pregunta es, ¿voy a hacer esto de la manera correcta? Mi vista extiende DefaultHtmlView que se siente mal, ¿debería crear un DefaultJsonView? ¿Cómo puedo configurar el tipo de contenido correcto o hay un mejor enfoque para devolver JSON?

Se agradece cualquier consejo que se pueda dar sobre la mejor manera de usar Joomla Framework para construir una API.

11
Joe P

Finalmente encontré lo que parece ser la forma "correcta" de hacer esto. Incluso si utilicé sendHeaders, se agregó el Tipo de contenido adicional y se devolvió como se agregó más tarde.

Seguí el código y AbstractWebApplication.php establece los encabezados con esta línea:

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

Así que pude definir mi propio mimeType usando esto en mi código:

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

¡Ahora se devuelve el encabezado correcto y jQuery entiende la salida como JSON!

6
Joe P

Tomó un poco de investigación pero veo el problema

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

Si observa la función setHeader, en realidad aún no establece el encabezado, solo lo "prepara"

Entonces, lo que necesitas hacer es simple

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

La función adicional sendHeaders() se puede encadenar para permitirle configurar los encabezados, no solo "prepararlos".

Con muy probablemente usando exit; para evitar futuras ejecuciones y generar el JSON, la función sendHeaders probablemente no se esté ejecutando.

3
Jordan Ramstad