質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

7233閲覧

Cakephp3でJSON形式でPOSTしたデータの取得について

holstein_killer

総合スコア10

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2017/07/08 18:44

###質問
JSON形式でPOSTした場合に、リクエスト先のコントローラのinitialize()またはbeforeFilter()でPSOTデータを取得したいのですが、
initialize()やbeforeFilter()の時点では$this->resuest->dataがArray()となっており取得できません。
アクションでは取得できます。
試しに入力Formを作って普通にsubmitしてPOSTした場合はinitialize()やbeforeFilter()でも取得できました。
JSON形式の場合だけinitialize()やbeforeFilter()で取得できません。
JSON形式でもinitialize()やbeforeFilter()でPOSTデータを取得するにはどうすればよろしいでしょうか。
よろしくお願いいたします。

###環境
CentOS 7.3
nginx 1.12
PHP 7.1
CakePHP 3.4

###ソースコード
RequestController.php

1. public function index() { 2. $http = new Client(); 3. $response = $http->post( 4. 'http://hoge.com/recieve/index', 5. json_encode(['foo' => 'foo']), 6. ['type' => 'json'] 7. ); 8. }

RecieveController.php

1. public function initialize() { 2. parent::initialize(); 3. $this->loadComponent('RequestHandler'); 4. $this->data = $this->request->getData(); ・・・(1)この時点ではArray() 5. } 6. 7. function public function beforeFilter(Event $event) { 8. parent::beforeFilter($event); 9. $this->data = $this->request->getData(); ・・・(2)この時点ではArray() 10. } 11. 12. function public function index() { 13. $this->data = $this->request->getData(); ・・・(3)この時点ではArray('foo' => 'foo')で取得できる 14. }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

手元の環境で動作確認した感じだと...
JSON形式の場合に、request->dataに配列を設定しているのは、RequestHandlerComponentのstartup()なので、コンポーネントのstartupが呼ばれる前のinitialize()やbeforeFilter()では空の配列になってしまうようです。
※JSON形式ではない場合は、requestオブジェクトの生成時にdataに配列が設定されるので、initialize()でもすでに値が設定されています。

JSON形式でもinitialize()やbeforeFilter()でPOSTデータを取得するにはどうすればよろしいでしょうか。

正直、正解はよくわかりません... $this->request->input()に値を持っているようなのでこれを自前でパースするとかですかねぇ
beforeFilter()等でgetData()したい理由によりますが、なるべくアクションで処理をした方が安全だと思います。共通化が目的なら共通メソッドを用意して各アクションの最初で実行するなど

投稿2017/07/08 23:01

編集2017/07/08 23:15
popobot

総合スコア6586

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

holstein_killer

2017/07/09 03:37

ご回答ありがとうございます。 initializeやbeforeFilterでPOSTデータを取得したかった理由は、beforeFilterで自作コンポーネントを呼び、その自作コンポーネントでPOSTされたデータを使用したかったためです。(beforeFilterで呼んだコンポーネントのメソッド内で$this->request->getData()がArray()なのは確認済み) コンポーネントをbeforeFilterではなくアクションで呼ぶ方向で検討したいと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問