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


11

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

私はComposerとJoomlaの入門をフォローしました記事を読み、Framework Appを稼働させてください。デフォルトのHTML出力をiFrameで機能するようにカスタマイズし、APIを開始しました。ニュースをテンプレートとして使用し、APIのコントローラー、モデル、テーブル、ビューを作成しました。次に、次のようにデータのJSON表現を返す非常にシンプルな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を構築するための最良の方法についてアドバイスをいただければ幸いです。

回答:


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すると、それ以上の実行が防止され、現在の状態で出力されます。あなたの答えははるかに良く見えます。
ジョーダンラムスタッド2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.