エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


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

 

 
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では変更になっています。
 

 
CakePHP3のころは、layoutと templateをまとめて指定する方法がありましたが、CakePHP4ではそれができなくなっているようです。
 
詳細は下記に記事を書いていますので、併せて参考にしてください。
CakePHP3のcontroller内でテンプレート、レイアウトを変更する際の指定方法
CakePHP4のController内でViewテンプレート、レイアウトの変更設定を記述する方法
 
 

initializeの定義の行でも違いがある

 
その他、細かなところで下記のような違いもあります。
initializeの定義の行でも違いがあります。
 

 
 

GETで送信された値を受け取る処理も異なる

 
GETで送信されてきた値を取得する処理も異なります。
 

 
 

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」に関する記事一覧
 
 

 - CakePHP 3.x 4.x 5.x

GoogleAdwords

GoogleAdwords

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

CakePHP3にデザインテンプレートBootstrapを導入する方法・friendsofcake/bootstrap-ui使用
CakePHP3にデザインテンプレートBootstrapを導入する方法・friendsofcake/bootstrap-ui使用

CakePHP3にプラグイン「friendsofcake/bootstrap-ui」、デザインテンプレート「Bootstrap」を設置する手順を解説。Bootstrapの簡単な使い方やデフォルトのデザインとの混在方法なども解説。

CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説
CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説

CakePHP3でパンくずの指定方法の解説。2つのヘルパーがあるが簡単なHTMLヘルパーを使った方法を、実際の状況に合わせて3つのパターン(エレメント化、ブロック化)にして解説。

CakePHP3で保存前にバリデーション結果を取得する2つの方法
CakePHP3で保存前にバリデーション結果を取得する2つの方法

CakePHP3でデータベースに値を保存する前にバリデーションを行い、その結果によって処理を振り分ける方法について解説。「$topic->errors()」と「$topic->hasErrors()」の2つの方法がある。

CakePHP3で他のテーブルのマスタテーブルからセレクトボックス(プルダウンリスト)を作る
CakePHP3で他のテーブルのマスタテーブルからセレクトボックス(プルダウンリスト)を作る

他のテーブルのマスタのレコードからプルダウンリストを作成し、選択できるようにするサンプルプログラムと解説。ORMの設定によりデータベースの値を取得し、配列を作成し optionsに与える。

CakePHP3のタイムゾーンを協定世界時UTCから日本標準時間JSTにずれを変更する方法
CakePHP3のタイムゾーンを協定世界時UTCから日本標準時間JSTにずれを変更する方法

CakePHP3の標準設定のタイムゾーンは「UTC(協定世界時)」に設定されている。これを日本標準時に変更する方法(app.php、bootstrap.phpの変更方法)の解説。

CakePHP4のcake cache clear_allでPermission deniedはパーミッションの変更が必要
CakePHP4のcake cache clear_allでPermission deniedはパーミッションの変更が必要

CakePHP4でキャッシュをクリアするコマンドcake cache clear_allでPermission deniedのエラーが出るのはcakeにパーミッションが足りないとき。その対処方法を解説。

MySQL、CakePHP 2.3で「tinyint(1)」の Boolean型の動作を再確認

MySQL+CakePHPの環境で「tinyint(1)」を利用する際の動作を検証。「tinyint(1)」の Boolean型について CakePHPでは自動処理が実施されていることを確認しました。

CakePHP3のビューで受取ったテーブルのオブジェクトを連想配列に変換する方法
CakePHP3のビューで受取ったテーブルのオブジェクトを連想配列に変換する方法

コントローラーからビューに送ったテーブルのオブジェクトを連想配列に変換し、ビューの中で自由に使えるようにするメソッド「toArray()」の解説。連想配列に変換できれば利用度アップ!

CakePHP4系、5系でカラムを指定して値があるかないかのチェックする
CakePHP4系、CakePHP5系のexists()でカラムを指定して値の有無をチェックする方法解説

CakePHP4、5で指定したカラムに特定の値に該当のレコードの有無をチェックするにはexists()を使う。単純にカラムを指定する方法から複数条件をand、orで探すこともできる。

CakePHP3のInsert On Duplicate Key Update(upsert)構文を解説・バルク処理も
CakePHP3のInsert On Duplicate Key Update(upsert)構文を解説・バルク処理も

CakePHP3で Insert … On Duplicate Key Update構文(upsert)を実行する方法を解説。バルク処理の方法も用意されているため大量処理の場合も対応可能。