Вернуть JSON с помощью Joomla Framework

11

Я начал создавать веб-приложение с использованием Joomla Framework . Он состоит из простой веб-страницы, которая будет отображаться в iFrame вместе с API, который будет использоваться для обновления содержимого с помощью AJAX.

Я следил за началом работы с Composer и Joomla! статья и есть Framework App и работает. Я настроил вывод HTML по умолчанию для работы с iFrame и начал работу с API. Я использовал News в качестве шаблона и создал контроллер, модель, таблицу и представление для своего API, и все это прекрасно работает. Затем я создал очень простой шаблон Twig, который возвращает JSON-представление моих данных, например:

{{ items|json_encode|raw }}

Пока все хорошо, но я возвращаю этот заголовок, который вызовет проблемы при использовании AJAX с jQuery:

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

Я думал, что это будет простой случай добавления этого, но независимо от того, где я его поместил, он не меняет возвращаемый заголовок:

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

Я знаю, что setHeader работает так, как будто я меняю имя, вижу новый заголовок, возвращенный, поэтому я предполагаю, что он перезаписывается позже при выполнении.

Итак, мой вопрос: правильно ли я поступаю? Мой взгляд расширяет DefaultHtmlView, который кажется неправильным, я должен создать DefaultJsonView? Как я могу установить правильный Content-Type или есть лучший подход для возврата JSON?

Будем весьма благодарны за любые советы, которые могут быть даны о наилучшем способе использования Joomla Framework для создания API.

Джо П
источник

Ответы:

6

Я наконец нашел то, что кажется «правильным» способом сделать это. Даже если бы я использовал sendHeaders, добавлялся дополнительный Content-Type, который возвращался, как и позже.

Я следовал по коду и AbstractWebApplication.php устанавливает заголовки с этой строкой:

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

Таким образом, я смог определить свой собственный mimeType, используя это в моем коде:

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

Теперь возвращается правильный заголовок, и jQuery понимает вывод как JSON!

Джо П
источник
3

Немного покопался но вижу проблему

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

Если вы посмотрите на функцию setHeader, она еще не установила заголовок, она только «готова»

Итак, что вам нужно сделать, это просто

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

Дополнительная функция sendHeaders()может быть объединена в цепочку, чтобы вы могли устанавливать заголовки, а не просто «подготавливать» их.

Скорее всего, при использовании exit;для предотвращения дальнейшего выполнения и вывода JSON функция sendHeaders, скорее всего, не работает.

Джордан Рамстад
источник
Спасибо за ваше предложение. К сожалению, даже почему я использовал sendHeaders, Content-Type все еще начинали перезаписываться. Я попытался использовать выход, но затем я не получил вывод, так как шаблон не отображался. Я нашел решение, которое я отправил в качестве ответа.
Джо П
Что ж, я добавлю другое решение, просто мое работает и для тех, кому это может понадобиться. Если вы используете exitего, это должно помешать запуску чего-либо еще и просто вывести его как есть. Ваш ответ кажется намного лучше, хотя.
Джордан Рамстад