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