フロントをVue.js、サーバサイドをCakePHP2で作っていてaxiosでPOST送信したときに、CakePHP2でうまく取得できなくて躓いたのでメモ。
普通に送信する(だめな例)
axios.post( '/sample.php', {
test: '送信データだよ',
} )
.then( ( res ) => {
//送信完了
} );
このときに、CakePHP側で
$test = $this->request->data('test');
debug($test);
ってやったら null
になってしまった。
調べてみたら、axiosのPOST送信はbodyにJSON形式でデータを送信するらしいので、PHPの$_POST
だと取得できないらしい。
対策
(対策その1)CakePHPのドキュメントにかいてありました。
axios側は普通に
axios.post( '/sample.php', {
test: '送信データだよ',
} )
.then( ( res ) => {
//送信完了
} );
CakePHP2で取得方法が以下になります。
$data = $this->request->input('json_decode');
debug($data->test);//オブジェクトで取得されます
これで取得できました。
注意点としては、取得データがオブジェクト形式となること。個人的にはそのほうが好きなんですが、なんかCakePHP2って、こういうのを連想配列にいれちゃう感じがしてて、すこし戸惑いがありました。
とはいえ、おそらくこれがベストな方法かと思います。
##(対策その2)axios側で送信方法を工夫する
axios側で、POSTをapplication/x-www-form-urlencodedの形式(いつものPOSTのやつ)で送信するようにできます。
こちらだと、受ける側のPHPでは、いつもの方法で取得できます。
(axios側のスクリプト)
let formdata = new URLSearchParams(); //クエリパラメータ作成用のクラス
formdata.append('test','送信データだよ'); //クエリを追加
axios.post( '/sample.php', formdata)
.then( ( res ) => {
//送信完了
} );
この方法で送信すれば
$test = $this->request->data('test');
これでデータを取得できます。
ただ、複雑なデータを送信するときなどは、js側での処理がちょっと面倒になりがちで、axios(というかvue.jsとか)を使っている旨みがなくなりそう。
フロント側しかいじれないような局面では有効かも。
(対策その3)PHPで生のJSONを取得
cakePHPとか関係なく、PHPでPOST送信されてきたJSONデータを直接取得する方法です。
axios側の送信は普通ので行けます。
axios.post( '/sample.php', {
test: '送信データだよ',
} )
.then( ( res ) => {
//送信完了
} );
PHP側で取得する処理
$request_body = file_get_contents('php://input'); //送信されてきたbodyを取得(JSON形式)
$data = json_decode($request_body,true); // デコード
debug($data['test']); //当たり前だけど連想配列です。
とくにこの方法を選択する意味はないかもですが、CakePHP以外でも使えるので、覚えておきたいなと思って。
あと、json_decode()
するんで当たり前ですが $_POST
とかで取得したときみたいに連想配列で取得できます。
以上、自分は最初POSTを取得できないことに焦って、3番目の方法でずっとやってたんですが、あとから調べたらいろいろ良い方法があって後悔したので、メモ代わりに書いておきます。
参考
https://book.cakephp.org/2.0/ja/controllers/request-response.html#xml-json
https://github.com/axios/axios#using-applicationx-www-form-urlencoded-format
https://qiita.com/amamamaou/items/b6cb39739bba4abf4544