CakePHP 2.0 で Content-Type を変更する方法

例えばコントローラーで header() を使って Content-Type を変更します。

1
header("Content-Type: text/xml; charset=UTF-8");

すると以下のように勝手に変更される、あるいは変更されません。これは Firefox のアドオンである Firebug を使うと確認することができますので、ヘッダの確認の際はこれを使いましょう。

$this->header() を使う

CakePHP 2.0 で Content-Type を設定するには以下のようにするようです。以下のページに書いてありました。

1
$this->header('Content-Type: text/xml');

$this->RequestHandler->respondAs() を使う

respondAs() でも行けるようです。どっちを使ったらいいのやら。以下のページでは respondAs() を使っていたので私もこちらを使う方向で進めてみます。

ただ使う際は beforeFilter() の中で実行しないといけないという条件があるようです。

1
2
3
4
5
public function beforeFilter()
{
    parent::beforeFilter();
    $this->RequestHandler->respondAs('text/xml; charset=UTF-8');
}

ただ、アクションの中で実行しても上手く動きました。逆に beforeFilter() の中で宣言したら動きませんでした。時間がないのでここはアクションの中で一応実行することにしておきます。

1
2
3
4
public function hoge()
{
    $this->RequestHandler->respondAs('text/xml; charset=UTF-8');
}

すると何故か charset=UTF-8 が2回設定されてしまった。

なので charset=UTF-8 を除いて実行すると。

1
2
3
4
public function hoge()
{
    $this->RequestHandler->respondAs('text/xml');
}

すると以下のようになりました。

まとめ

自己解釈になりますが、$this->header は header() に相当するようなもので自由に設定できる、$this->RequestHandler->respondAs() は Content-Type も無く設定できることから、レスポンスのタイプを変更する専用というところでしょうか。何かわかったら追記していきます。

コメント

コメントは受け付けていません。