エス技研

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

// CakePHP3系
$this->render(false,false);

// CakePHP4系
$this->autoRender = false;
$this->layout     = false;

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

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

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

// CakePHP3系
public function initialize() {

// CakePHP4系
public function initialize(): void {

 
 

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

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

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

 - CakePHP 3.x 4.x 5.x

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

Message

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

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

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

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

  関連記事

CakePHP 2.3で確認画面付きのお問い合わせフォームの作り方

CakePHPで確認画面付きのお問い合わせフォーム、メールフォームの作り方をサンプルを提示しながら解説。

CakePHP3のメール送信の処理・テンプレート使用・添付ファイル送信も解説
CakePHP3のメール送信の処理・テンプレート使用・添付ファイル送信も解説

CakePHP3からメールを送信する方法解説。基本的な記述方法を基にして、テンプレートを使う方法、ファイルを添付する方法へと拡張しながら解説。

CakePHP3で値を入力直後にバリデーションする方法解説
CakePHP3で値を入力直後にバリデーションする方法解説

CakePHP3でバリデーションの実行を保存する時から入力情報を受け取るときに変更する処理の解説。CakePHP3ではnewEntity()の処理でバリデートするため1行追加で対応可能。

CakePHP 2.3で PDFを作成する方法を調査「mpdf」「TCPDF」「FPDF」

CakePHPで PDFを編集、出力するには「mpdf」「TCPDF」「FPDF」といったプラグインがあり、使い勝手を比較検討しました。TCPDFが一番良さそうでした。

CakePHP3のアソシエーション機能を使い関連レコードをまとめて削除

CakePHP3でレコードを削除する際に関連するレコードをまとめて削除する機能の解説。フレームワークのメリットを存分に発揮し、コマンドを1行追加するだけで実装可能。

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

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

CakePHP3ログファイルの出力方法・$this->log()の解説
CakePHP3ログファイルへの出力・$this->log()、独自ログへの出力方法の解説

コントロール、モデルの変数の中身を見るときはログに出力する方法が有効です。$this->log()を利用すると変数だけじゃなく、連想配列、オブジェクトも簡単にログ出力ができます。

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

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

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

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

CakePHP3で生の SQLの実行はConnectionManagerを使う
CakePHP3で生の SQLの実行はConnectionManagerを使う

CakePHP3で生の SQL文を実行する方法を解説。クリエビルダーを使う場合は TableRegistryを利用するが、SQLを実行する場合は ConnectionManagerを使う。プリペアードステートメントの使用方法も解説。