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の関連記事
CakePHPのpostlinkで生成した削除リンクをクリックしても処理が実行されない対処法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」に関する記事一覧
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP4で「app_local.php」「.env」を利用して環境ごとの定数を振り分ける方法
CakePHP4で.env、app_local.phpに定数を定義してそれを呼び出す方法の解説。Gitでは管理せず本番環境と開発環境とで異なる定数を定義するためそれを利用する方法。
-
-
CakePHP3のfriendsofcake/searchでツリーカテゴリーの子階層も含めて検索する方法
CakePHP3のツリービヘイビアを使ったツリーカテゴリーの子階層も含めての検索を検索プラグイン「friendsofcake/search」を使って実現する方法を解説しました。
-
-
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3でajaxを利用する処理の実装方法を解説。プルダウンを変更するとデータベースの値を取得し検索結果の内容を変更するというような処理を想定。CakePHP3.6以降の CSRF対策対応済。
-
-
CakePHP3の画像、ファイルアップロードプラグインUpload Plugin 3.0の設置解説・その1
CakePHP3でファイル、画像をアップロードするプラグイン、upload plugin 3を導入する手順を解説した記事。3部作のその1で基本的な導入方法の解説で読みながら簡単に導入が可能。
-
-
CakePHP 2.3で saveの便利な使い方・サンプルソース付き
CakePHPのレコードを保存、更新する際に使う Saveを詳細解説します。
-
-
CakePHP4の規約外のカラムをキーにアソシエーション(テーブル連結)する方法
CakePHPで規定外のカラム名のキーを指定してアソシエーション(テーブル連結)をする方法を解説。アソシエーション名によってはミスが発生しやすい点もあるので注意も必要。
-
-
CakePHP4、5のユーザ認証でID、PASS以外の削除フラグなども条件加える方法
CakePHP4系、5系ではAuthenticationを使用してログイン認証を行う。その認証でID、PASS以外の削除フラグなどの条件を加えたいときの対応方法について解説。
-
-
CakePHP3のメール送信の処理・テンプレート使用・添付ファイル送信も解説
CakePHP3からメールを送信する方法解説。基本的な記述方法を基にして、テンプレートを使う方法、ファイルを添付する方法へと拡張しながら解説。
-
-
CakePHP4のcake cache clear_allでPermission deniedはパーミッションの変更が必要
CakePHP4でキャッシュをクリアするコマンドcake cache clear_allでPermission deniedのエラーが出るのはcakeにパーミッションが足りないとき。その対処方法を解説。
-
-
CakePHP3、CakePHP4のdatetime型カラムの日時の扱い。秒まで表示する方法
CakePHP3の日時カラムで秒まで扱う場合はdate()、strtotime()関数ではうまくいかない。CakePHP3であらかじめ用意された「i18nFormat()」を使用する。