Retornar JSON usando o Joomla Framework

11

Comecei a criar um aplicativo da 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 a Introdução ao Composer e Joomla! artigo e tenha o aplicativo Framework 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é aí tudo bem, mas eu recebo esse cabeçalho retornado, o que causará problemas ao usar o AJAX com o 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);

Eu 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 é: eu 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.

Joe P
fonte

Respostas:

6

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!

Joe P
fonte
3

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".

Com o uso mais provável exit;para impedir mais execução e saída do JSON, a função sendHeaders provavelmente não está em execução.

Jordan Ramstad
fonte
Obrigado por sua sugestão. Infelizmente, mesmo porque eu usei o sendHeaders, o tipo de conteúdo ainda era substituído. Tentei usar exit, mas não obtive saída porque o modelo não havia renderizado. Encontrei uma solução que publiquei como resposta.
Joe P
Bem, vou adicionar outra solução, para que a minha funcione bem para quem precisar. Se você usá- exitlo, deve impedir que algo mais seja executado e apenas produzi-lo como está atualmente. Sua resposta parece muito melhor.
Jordan Ramstad