使用Joomla框架返回JSON


11

我已经开始使用Joomla Framework构建Web应用程序。它由一个简单的网页(将显示在iFrame中)以及一个API(用于通过AJAX更新内容)组成。

我遵循了Composer和Joomla入门!文章,并启动并运行Framework App。我已自定义默认HTML输出以使其可用于我的iFrame,并开始使用API​​。我将新闻用作模板,并为我的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框架构建API的最佳方法所提供的建议的任何帮助将不胜感激。

Answers:


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,但是由于没有渲染模板,所以没有输出。我找到了一个解决方案,并将其发布为答案。
Joe P

好吧,我将添加另一种解决方案,以便我的解决方案对于可能需要它的人也适用。如果您使用exit它,应该会阻止其他任何事情的运行,并仅输出当前状态即可。您的答案确实好很多。
乔丹·拉姆斯塔德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.