【CakePHP3】withParsedBody()で画面からPOSTされたデータを再現する

Bake-with-CakePHP Logo

たとえば1.入力画面→2.確認画面→3.保存完了画面というフローがあったとする。

1.から2.へはSessionでデータを引き継がせるようにしていたとして、

2.の入力内容から「修正する」ボタンを押してGetリクエストにて1.の入力画面へ戻ってきた時、引き継いだ入力情報をどうやって入力画面へ反映させるとスマートなのか?

で悩んだことがある。

 

その時に使ったのが、$this->requestでおなじみのServerRequestオブジェクトに用意されているwithParsedBody()メソッドだ。これ、結構使える関数なので紹介していく。検証したCakePHPのバージョンは3.6.13。

$this->request->withParsedBody()は、GETやPOSTにてデータが渡された状態のリクエストを意図的に作ることができる

↑で書いた通りのままだが、withParsedBody()は画面からGETやPOSTにてデータが渡された状態のリクエストを意図的に作ることができるメソッドだ。内部的には下記のように、自分のServerRequestインスタンスを複製した上でデータをセットし、それを返してくれる:

もし1カラムずつデータをセットさせたい場合はwithData()を使うと良いらしい:

withParsedBody()の使いどころ

確認画面から入力画面に戻ってくる時の処理を例に出すと、こんな感じ:

Line:29~35の処理がキモだ。

ただ個人的にまだ未解決なのが、セッションに引き継がせた情報をread()で取得した上でwithParsedBody()に渡すのは上手くいくのに、consume()で取得した情報をwithParsedBody()に渡すと何も渡せてない状態になること。consume()もwithParsedBody()も同じ$this->requestを使っているあたりで、何らか予期しないことが起こっているのかもしれない。今後要調査。

 

上記以外にwithParsedBody()が活躍しそうな場所としては、Controllerのテストコード。なぜなら画面から入力されたリクエストデータを再現することができるので。

 

参考)https://api.cakephp.org/3.6/class-Cake.Http.ServerRequest.html#_withParsedBody