CakePHP + AjaxでのPOSTで受け取った情報が空になる原因

CakePHP2

Ajaxでフォームから情報を取得して、CakePHPで作成したAPIのエントリポイントにPOSTをした時、どうしてもCakePHP側の$this->request->dataが空になるときの対応です。

以下の様なAjaxのコードがあったとします。

$.ajax({
	type: 'POST',
	url: '/Ajax/postsample',
	data: {
		'id':11111, 'string':'hogehoge',
	},
	success: function(response){
		alert('成功');
	},
	error: function(response){
		alert('失敗');
	}
});

 

CakePHP側では$this->request->dataの内容が、以下のようになって欲しいです。これが空になるときの原因です。

'id' => 11111,
'string' => 'hogehoge'

 

 

チェック項目が幾つかあります。

■Securityコンポーネントが邪魔をしている

Securityコンポーネントが邪魔をしているときがあります。CakePHPのSecurityコンポーネント使っていると、Ajaxで動的にフォームを書き換えたりとかするとエラーになったります。受け取る側のコントローラのBeforeFilterでSecurityComponentを一時的に無効にしましょう。対象のアクションのみ無効にする例です。

if ($this->params['action'] == アクション名) {
	$this->Security->csrfCheck = false;
	$this->Security->validatePost = false;
}

 

■AjaxのDataTypeの指定間違い

確認すると、APIにアクセスした時のMIMEが正しくないとだめ。とあります。省略すると自動で判断してくれるみたいです。指定すると「渡された配列が空」になることがあります。

Ajaxの記述に「DataType」のオプションが書いて有るときは一旦外してみると良いかもしれません。