ti-enxame.com

Retornar JSON usando o Joomla Framework

Eu comecei a construir uma aplicação web usando o Joomla Framework . Consiste em uma página da web simples que será exibida em um iFrame junto com uma API que será usada para atualizar o conteúdo com o AJAX.

Eu segui o artigo Introdução ao Composer e Joomla! e tenho o App de estrutura em funcionamento. Eu personalizei a saída HTML padrão para funcionar no meu iFrame e iniciei a API. Usei o News como modelo e criei um controlador, modelo, tabela e exibição para minha API, que funciona muito bem. Criei um modelo Twig muito simples que retorna uma representação JSON dos meus dados como esta:

{{ items|json_encode|raw }}

Até agora tudo bem, mas eu recebo esse cabeçalho retornado, o que causará problemas ao usar AJAX com jQuery:

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

Eu pensei que seria um caso simples de adicionar isso, mas não importa onde eu coloquei, ele não altera o cabeçalho retornado:

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

Sei que o setHeader está funcionando como se eu mudasse o nome, vejo o novo cabeçalho retornado, portanto, suponho que ele será substituído posteriormente na execução.

Então, minha pergunta é: vou fazer isso da maneira certa? Minha visão estende o DefaultHtmlView que parece errado, devo criar um DefaultJsonView? Como posso definir o tipo de conteúdo correto ou existe uma abordagem melhor para retornar o JSON?

Qualquer ajuda que possa ser dada sobre a melhor maneira de usar o Joomla Framework para criar uma API será muito apreciada.

11
Joe P

Finalmente encontrei o que parece ser a maneira "correta" de fazer isso. Mesmo se eu usasse o sendHeaders, o Tipo de Conteúdo adicional estava sendo adicionado e retornado, como foi adicionado posteriormente.

Eu segui o código e AbstractWebApplication.php define os cabeçalhos com esta linha:

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

Então, eu fui capaz de definir meu próprio mimeType usando isso no meu código:

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

Agora o cabeçalho correto é retornado e o jQuery entende a saída como JSON!

6
Joe P

Levou um pouco de escavação, mas vejo o problema

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

Se você olhar para a função setHeader, ela ainda não define o cabeçalho, apenas o deixa "pronto"

Então, o que você precisa fazer é simples

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

A função extra sendHeaders() pode ser encadeada para permitir que você defina os cabeçalhos, e não apenas "prepará-los".

Provavelmente usando exit; para impedir qualquer execução adicional e gerar o JSON, a função sendHeaders provavelmente não está em execução.

3
Jordan Ramstad