web-dev-qa-db-ja.com

Joomlaフレームワークを使用してJSONを返す

Joomla Framework を使用してWebアプリケーションの構築を開始しました。これは、iFrameに表示されるシンプルなWebページと、AJAXでコンテンツを更新するために使用されるAPIで構成されます。

Getting Started with Composer and Joomla! の記事に従って、 Framework App を稼働させています。デフォルトのHTML出力をカスタマイズしました私のiFrameで動作し、APIを開始しました。Newsをテンプレートとして使用して、APIのコントローラー、モデル、テーブル、ビューを作成しました。すべてがうまく機能します。次に、非常にシンプルなTwigテンプレート:

{{ items|json_encode|raw }}

これまでのところ良好ですが、jQueryでAJAXを使用すると問題が発生するこのヘッダーが返されます。

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

これを追加するのは簡単なケースだと思いましたが、どこに置いても、返されるヘッダーは変更されません。

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

名前を変更したかのようにsetHeaderが機能していることはわかっていますが、新しいヘッダーが返されるので、後で実行時に上書きされると思います。

だから私の質問は、私はこれを正しい方法で行っているのですか?私のビューは間違っていると感じるDefaultHtmlViewを拡張します。DefaultJsonViewを作成する必要がありますか?どのようにして正しいContent-Typeを設定できますか、またはJSONを返すためのより良いアプローチはありますか?

Joomlaフレームワークを使用してAPIを構築するための最良の方法についてアドバイスをいただければ幸いです。

11
Joe P

これを行う「正しい」方法のように見えるものが最終的に見つかりました。 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として理解します。

6
Joe P

少し掘り下げましたが、問題が発生しています

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関数が実行されていない可能性があります。

3
Jordan Ramstad