14
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【CakePHP2】axiosのPOST送信のデータを取得する

Last updated at Posted at 2018-06-09

フロントをVue.js、サーバサイドをCakePHP2で作っていてaxiosでPOST送信したときに、CakePHP2でうまく取得できなくて躓いたのでメモ。

普通に送信する(だめな例)

sample.vue
axios.post( '/sample.php', {
    test: '送信データだよ',
} )
.then( ( res ) => {
    //送信完了
} );

このときに、CakePHP側で

sample.php
$test = $this->request->data('test');
debug($test);

ってやったら null になってしまった。
調べてみたら、axiosのPOST送信はbodyにJSON形式でデータを送信するらしいので、PHPの$_POSTだと取得できないらしい。

対策

(対策その1)CakePHPのドキュメントにかいてありました。

axios側は普通に

sample.vue
axios.post( '/sample.php', {
    test: '送信データだよ',
} )
.then( ( res ) => {
    //送信完了
} );

CakePHP2で取得方法が以下になります。

sample.php
$data = $this->request->input('json_decode');

debug($data->test);//オブジェクトで取得されます

これで取得できました。
注意点としては、取得データがオブジェクト形式となること。個人的にはそのほうが好きなんですが、なんかCakePHP2って、こういうのを連想配列にいれちゃう感じがしてて、すこし戸惑いがありました。
とはいえ、おそらくこれがベストな方法かと思います。

##(対策その2)axios側で送信方法を工夫する
axios側で、POSTをapplication/x-www-form-urlencodedの形式(いつものPOSTのやつ)で送信するようにできます。
こちらだと、受ける側のPHPでは、いつもの方法で取得できます。

(axios側のスクリプト)

sample.vue
let formdata = new URLSearchParams(); //クエリパラメータ作成用のクラス
formdata.append('test','送信データだよ'); //クエリを追加

axios.post( '/sample.php', formdata)
.then( ( res ) => {
    //送信完了
} );

この方法で送信すれば

sample.php
$test = $this->request->data('test');

これでデータを取得できます。
ただ、複雑なデータを送信するときなどは、js側での処理がちょっと面倒になりがちで、axios(というかvue.jsとか)を使っている旨みがなくなりそう。
フロント側しかいじれないような局面では有効かも。

(対策その3)PHPで生のJSONを取得

cakePHPとか関係なく、PHPでPOST送信されてきたJSONデータを直接取得する方法です。
axios側の送信は普通ので行けます。

sample.vue
axios.post( '/sample.php', {
    test: '送信データだよ',
} )
.then( ( res ) => {
    //送信完了
} );

PHP側で取得する処理

sample.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

14
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?