CakePHP4系でJSONレスポンスの処理ではwithStringBodyを使う。3との違い解説
2025/01/31
CakePHPでJSONレスポンスの処理において 4系と 3系の違いについて解説
CakePHPで JSON形式のレスポンスを実行する処理について解説します。
記事の主眼は CakePHP3から CakePHP4に移行する際の差異についてになります。
例えば、CakePHPで APIの処理を構築する場合、プログラムで処理を行って、レスポンスを JSON形式で行う場合の処理になります。
CakePHP3と CakePHP4とでは結構処理が変わっていますので、レスポンスを返す処理を中心に解説します。
参考 Cookbook リクエストとレスポンスオブジェクト ボディーの設定
https://book.cakephp.org/4/ja/controllers/request-response.html#id21
CakePHP 3系と 4系それぞれの JSONレスポンス処理
3系:body 4系:withStringBody
1 2 3 4 5 |
// CakePHP3系 $response->body(json_encode($data)); // CakePHP4系 return $response->withType('application/json')->withStringBody(json_encode($data)); |
CakePHP3系(正確には CakePHP 3.3以前)では「$response->body()
」だけですが、CakePHP4系では「withType」で JSON形式であることを指定し、「withStringBody」で送信するデータを指定します。
その際、データは「json_encode()」でエンコードしたものを指定します。
ちなみに、それ以前の処理によっては「$response
」が「$this->response
」の場合もあるのではないかと思います。
CakePHP4系では Returnがないとレスポンスを実行しない
また、CakePHP3では「$response->body()
」だけでレスポンスまで実行されていました。
ですが、CakePHP4では「return $this->response->withType()->withStringBody();
」のように、最初に「return」を付ける必要があります。
「return」を実行しないと値を返さないためです。
layoutや templateを使用しない場合の記述方法が変更になっている
また、今回は JSONで値を返す処理ですが、JSONで値を返すのは APIの処理を構築しているのではないか、と思います。
その場合は、layoutや templateを使用しない場合が多々あるのではないかと思いますが、layoutや templateを使用しない場合の記述方法も CakePHP4では変更になっています。
1 2 3 4 5 6 |
// CakePHP3系 $this->render(false,false); // CakePHP4系 $this->autoRender = false; $this->layout = false; |
CakePHP3のころは、layoutと templateをまとめて指定する方法がありましたが、CakePHP4ではそれができなくなっているようです。
詳細は下記に記事を書いていますので、併せて参考にしてください。
「CakePHP3のcontroller内でテンプレート、レイアウトを変更する際の指定方法」
「CakePHP4のController内でViewテンプレート、レイアウトの変更設定を記述する方法」
initializeの定義の行でも違いがある
その他、細かなところで下記のような違いもあります。
initializeの定義の行でも違いがあります。
1 2 3 4 5 |
// CakePHP3系 public function initialize() { // CakePHP4系 public function initialize(): void { |
GETで送信された値を受け取る処理も異なる
GETで送信されてきた値を取得する処理も異なります。
1 2 3 4 5 |
// CakePHP3系 $key = $this->request->query('key'); // CakePHP4系 $key = $this->request->getQuery('key'); |
CakePHP 3系と 4系それぞれの JSONレスポンス処理のまとめ
CakePHP3もバージョンによって仕様が違いますので、単純に CakePHP3系と CakePHP4系との違いと言えない仕様もありますが、CakePHP3系からの CakePHP4系への移行の場合は、それぞれの違いを理解しつつ、冷静に一つずつ修正していく必要がありますね。
一つの記事を読んで、そこに書いてあるサンプルをまねて書き替えて、動かないのでまた別のページを探して、ということではなく、一つのサンプルを書き換えたところで、ほぼできているのに、他にも変更する必要がある個所が修正されていないので、求めている結果にならない...という場合も多々あるのではないかと思います。
CakePHP4の関連記事
CakePHP4系でJSONレスポンスの処理ではwithStringBodyを使う。3との違い解説CakePHP4、CakePHP5の「warning: DebugKit is disabling...」の対処方法
MySQL+CakePHPのdate型、datetime型項目は「2999-12-31」までしか扱えない
CakePHP4のFrozenDateで1ヵ月前、先月、今月1日、来月末の日付などを算出する方法
CakePHP4のcake cache clear_allでPermission deniedはパーミッションの変更が必要
CakePHP4のクリエビルダーを使用してOR条件をAND条件でつなぐSQL文を作る方法
CakePHP4のController内でViewテンプレート、レイアウトの変更設定を記述する方法
CakePHP4から外部のデータベースにアクセスする方法解説
CakePHP4の数値項目は「like %10%」の部分一致検索(find select)はできない
CakePHP4でロギングスコープやログレベルを使用してログを出し分ける方法を解説
その他の「CakePHP4」に関する記事一覧
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP3チュートリアルで日付と時刻のDateTimeでエラーが出たときの対処方法
CakePHP3のブックマークチュートリアルには記載ミスもあり、そのまま動かない個所もある。CakePHP3では namespaceを使うようになったので、classを呼び出すときに¥を追加する必要が!
-
-
CakePHP3でデータを保存する save()で発生するエラーを確認する方法を解説
CakePHP3でデータ保存処理のログを取得する方法。save()では true、falseの戻り値しか取得できないが、saveOrFail()と try…catch文を使いエラーログ、エンティティを取得し、不具合の解析を行う。
-
-
CakePHP3のfriendsofcake/searchでツリーカテゴリーの子階層も含めて検索する方法
CakePHP3のツリービヘイビアを使ったツリーカテゴリーの子階層も含めての検索を検索プラグイン「friendsofcake/search」を使って実現する方法を解説しました。
-
-
CakePHP3でテーブルにカラム(項目)を追加したときに変更するポイントのまとめ
CakePHP3でシステム開発をする際、途中でカラムを追加した場合に何を変更すればいいかを確認。カラムを追加する前後で Bakeした結果を比較し、変更になった点をリストアップした。
-
-
CakePHP3のルーティング(routes.php)の変更が反映されない時はキャッシュのクリアを
CakePHP3でルーティングの設定変更をしたけど反映されない!そんなときは慌てず騒がずキャッシュをクリアしよう!ルーティングの設定もキャッシュされることがあるらしい。
-
-
CakePHP3のUpload Plugin 3.0をバリデーションなど実運用向けのカスタマイズ方法解説・その2
CakePHP3でファイル、画像をアップロードするプラグイン、upload plugin 3を導入する手順を解説した記事。3部作のその2でバリデーションなどの実用的なカスタマイズ方法を解説。
-
-
CakePHP3で画像・ファイルのアップロード処理を自作・解説付き・その2
ファイルのアップロード機能の自作サンプルコードとその解説のその2。アップロード機能に関連するファイルの更新や削除の処理や画像、フォルダのパスの指定方法などを含めて解説。
-
-
CakePHP4、5でSELECT telephone as tel FROM usersの様にasでカラムに別名を付ける方法
CakePHP4、CakePHP5でクリエビルダーを利用してテーブルからレコードを取得する際、asを使用してカラムの別名で値を取得したい場合の対応方法を解説。また、別名にはハイフンやアスタリスクなど使用できない文字がある点も解説。
-
-
CakePHP3のタイムゾーンを協定世界時UTCから日本標準時間JSTにずれを変更する方法
CakePHP3の標準設定のタイムゾーンは「UTC(協定世界時)」に設定されている。これを日本標準時に変更する方法(app.php、bootstrap.phpの変更方法)の解説。
-
-
CakePHP3のアソシエーション機能を使い関連レコードをまとめて削除
CakePHP3でレコードを削除する際に関連するレコードをまとめて削除する機能の解説。フレームワークのメリットを存分に発揮し、コマンドを1行追加するだけで実装可能。