データ分析エンジニアのブログ

日常のことからプログラミングや機械学習まで@六本木

CakePHPでResponse HeadersのContent-Typeを変更する


こんにちは、結構前に書いたScrapyについての記事が地味にはてブがついたり、
Tweetされていたりして密かに喜んでいる、@ij_spitzです。


今回はCakePHPAjaxを実装したときに半日ほど躓いてしまったポイントについて書きたいと思います。


CakePHPは2.5系を使用しています。


CakePHPからAjaxを使うという記事はたくさんあるので、自分の体験談を書いていきます。


ハマりポイントは主に2つありました。
まず、こちらがjQueryを使って書いたJSのスクリプトです。

$.ajax({
  url: 'http://hoge.com/controller/action',
  type: 'POST',
  dataType: 'json',
  data: {
    id: $('#ajax_id').val()
  },
  success: function(data, status){
    if (data.message == 'success') {
      var ret = parseInt($('p#thanks').text()) + 1;
      $('p#thanks').text(ret);
    }
    console.log(data.message);
  },
  error: function(xhr, status, err) {
    alert('エラーが発生しました.');
  }
});

1. CakePHPでのAjaxパラメータの受け取り方

CakePHPではAjaxで送られてきたパラメーターは単純に、
$this->request->data['id']; というように取ることができます。


ですが、jQueryからjson形式で送られてきているので、パースしないと
なんて思って余計な処理をしていてなかなか値が取れませんでした。


これは簡単に解決したのですが、ここからが問題です。。。

2. CakePHPでResponse HeadersのContent-Typeを変更する

これがまじでしんどかったです。


http://weble.org/2011/11/29/cakephp-2-0-change-thecontent-type
http://nichiyoubi.ch/post/2839

上記の2つの記事を参考に


・ヘッダーの直書き
header("Content-Type: application/json; charset=UTF-8");


・Cakeのheaderメソッド
$this->header('Content-Type: application/json')


・RequestHandlerを使う
$this->RequestHandler->setContent('json');
$this->RequestHandler->respondAs('application/json; charset=UTF-8');


・responseオブジェクトを使う
$this->response->type('json');


・上記の処理をbeforeFilterの中でやってみる


以上のようにいろいろやってみたのですが、全く上手くいきませんでした。
Cakeのバージョンによって変更があったのかもしれません。


まあjsonAjaxしなくてもtextで諦めるか〜と思っていたのですが、解決策が見つかりました。
それがこちらです。

$this->autoRender = false;
return new CakeResponse(array('type' => 'json', 'body' => json_encode(array('message' => $message))));


参考にしたのは下記のURLです、この記事を見つけられてほんとよかったです。笑


http://pyonpyom.net/blog/107