エス技研

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


CakePHP4、5のnewEmptyEntityで作成したオブジェクトは空なのか、確認してみた

      2025/01/31

CakePHP4、5のnewEmptyEntityで作成したオブジェクトは空なのか?

 
CakePHP4系、CakePHP5系で新たにレコードを登録する際、「newEmptyEntity()」を使って空のオブジェクトを作成するかと思います。
 
この作成されたオブジェクトは「空」なのだろうか?と思い確認をしてみることにしました。
 
 
ちなみに、CakePHP4系、CakePHP5系の両方で確認しましたが、当たり前のように同じ結果でした。(CakePHPの処理ではなく、PHPの処理ですからね。)
 
 

「$this->Users->newEmptyEntity();」で生成した「$user」は「空」なのか?

 

public function add()
{
  $user = $this->Users->newEmptyEntity();
  if ($this->request->is('post')) {
    $user = $this->Users->patchEntity($user, $this->request->getData());
    if ($this->Users->save($user)) {
      $this->Flash->success(__('The user has been saved.'));

      return $this->redirect(['action' => 'index']);
    }
    $this->Flash->error(__('The user could not be saved. Please, try again.'));
  }
  $this->set(compact('user'));
}

 
上記は、Bakeして作成した Usersコントローラー内の addアクションです。
上記の 3行目の「$this->Users->newEmptyEntity();」で生成した「$user」は「空」なのか?
 
という確認を行いました。
 
 

「newEmptyEntity」で生成したオブジェクトを「empty」「is_null」などでチェックしてみた

 
具体的なチェックの処理と結果は以下の通りでした。
 

$userNewEntity = $this->Users->newEmptyEntity();
if($userNewEntity){
  echo "True<br>";          // ← True(Objectがあるので空ではない)
} else {
  echo "False<br>";
}
if(empty($userNewEntity)){
  echo "EmptyTrue<br>";
} else {
  echo "EmptyFalse<br>";    // ← EmptyFalse(Objectがあるので空ではない)
}
if(is_null($userNewEntity)){
  echo "NullTrue<br>";
} else {
  echo "NullFalse<br>";     // ← NullFalse(Objectがあるので Nullではない)
}
if($userNewEntity == []){
  echo "True<br>";
} else {
  echo "False<br>";         // ← False(Objectがあるので空配列ではない)
}

 
上記の中にコメントで結果を書いていますが、いずれも「空」「null」ではない、という結果になっています。
 
「$this->Users->newEmptyEntity();」で「空のエンティティ」を作る処理ではあるものの、作成されるものは「空のオブジェクト」であるので、「empty()」などでチェックするとそれは「空」ではないと判断されるということですね。
 
オブジェクトが生成されていますので、空ではないですよね。そりゃそうですよね、と。
 
 

「newEmptyEntity()」が空なのか、明確にしたかった理由

 
「newEmptyEntity()」が空なのか、これまであまり気にしたことがなかったのですが、それを明確にしたかった理由は、以下のように「newEmptyEntity()」で作成した値を引数として別の関数に渡す処理を構築しようとしていたためです。
 
より具体的には、addと editで行う処理を共通化しようと考えたのですが、その際、「newEmptyEntity()」で作成した値を「empty()」でチェックすることができるのだろうか?と疑問に思ったためでした。
 

public function add()
{
  // 前略

  $userNewEntity = $this->Users->newEmptyEntity();
  $userRes = $this->_addEdit($userNewEntity);

  // 後略
}

public function _addEdit($userEntity = [])
{
  // 引数のチェック
  if(!empty($userEntity)){
    return "Error";
  }

  // 続きの処理
  //   :
  //   :
}

 
「newEmptyEntity()」で作成した値は、「空」ではないことが明確になりましたので、引数が渡ってきていないときは、「empty()」が「true」になりますので、判別してエラー処理ができることが明確になりました。
 
これで、より不具合が少ないプログラムを組むことができますね。
 
 

想定外の値も想定した処理を構築する必要がある

 
かつて、私にプログラムを教えてくれた先輩がこんなことを言っていました。
「想定外の値が来た場合でもハングアップ(異常終了)しない処理を心がけろ」と。
 
想定外の値が来たときでも異常終了してしまうのではなく、想定外の値が来たとしてログを出力し、適切なエラー処理を実施したうえで、安全に停止するように処理を構築しろ、という意味です。
 
そのため、私が作成するプログラムは、若干エラーチェックがくどすぎると思うこともありますが、最初に教えてくれた方の教えなので、習慣になってしまっているとも言えますね。
 
どれだけの想定外を想定できるかが、いいシステムを構築するためのノウハウだ、ということも言っていましたね。
 
まぁ、どれくらいの信頼性が必要なシステムなのか、にもよりますけどね。
 
 

CakePHP5の関連記事

CakePHPのpostlinkで生成した削除リンクをクリックしても処理が実行されない対処法
CakePHP4、5のユーザ認証でID、PASS以外の削除フラグなども条件加える方法
CakePHP4、CakePHP5系の認証処理でログインの有無の確認、ユーザ情報の取得の方法
CakePHP4、5で$_SERVERと同じようにURIを取得する「getUri()」の紹介
getParam('action')で取得するアクション名は別関数に移動しても不変
CakePHP4系、CakePHP5系のexists()でカラムを指定して値の有無をチェックする方法解説
CakePHP4、5のnewEmptyEntityで作成したオブジェクトは空なのか、確認してみた
CakePHP4、5でSELECT telephone as tel FROM usersの様にasでカラムに別名を付ける方法
CakePHP4、5の認証処理で認証が通らない際の確認方法と確認箇所の紹介
CakePHP5系で認証機能のAuthenticationプラグインをインストール・エラー発生注意
 
その他の「CakePHP5」に関する記事一覧
 
 

 - CakePHP 3.x 4.x 5.x

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

Message

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

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

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

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

  関連記事

CakePHP 2.3 ID以外のカラムでアソシエーション(連携)をさせる場合の詳細ページの注意点

ID以外のカラムでアソシエーション(連携)させて詳細ページを表示させる際の考え方と注意点をサンプルソースを用いて解説しています。

CakePHP3にOGPをfetch、asignを利用してテンプレートごとに指定する方法を解説
CakePHP3にOGPをfetch、asignを利用してテンプレートごとに指定する方法を解説

CakePHP3でOGPを設定する方法を解説。fetch、assignを使用しレイアウトファイルに編集した変数にテンプレートファイルから値を指定する。これを利用してOGPを編集する。

CakePHP3でDocumentRootやwebroot、imgフォルダのURLやドメイン、パスを取得
CakePHP3でDocumentRootやwebroot、imgフォルダのURLやドメイン、パスを取得

URLやドメイン、フォルダへのパスの取得は、ビューではUrlHelperを使い、コントローラーではRouterクラスを使います。第2引数の指定でURLを取得することも可能。

CakePHPで同一テーブル内の値を比較する条件でレコードを取得する方法
CakePHPで同一テーブル内の値を比較する条件でレコードを取得する方法

CakePHPの同一テーブルにある項目の値を比較し条件に合致するレコードを取得する方法を解説。[”項目名”=>”値”]ではなく[”項目名 = 項目名”]と書くところがポイント。

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

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

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

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

CakePHP4で複数の引数(パラメータ)を付与してコマンドを実行する方法
CakePHP4で複数の引数(パラメータ)を付与してコマンドを実行する方法

CakePHP4でコマンドを実行する際に引数(パラメータ)をコマンド内で受け取る処理について解説。複数個の引数にも対応する記述方法も解説。

CakePHP 2.3 Search Pluginで検索処理 その7queryを使って 日付の範囲検索

CakePHPの検索プラグイン Search Pluginの検索処理の中で queryを使って日付の範囲検索の方法です。

CakePHP 2.3 連携先のテーブルの項目で条件抽出する場合

アソシエーション(連携)している先のテーブルの項目で条件抽出する際の考え方と注意点をサンプルソースを用いて説明しています。

CakePHP3で「SQLSTATE[23000]: Integrity constraint violation」「SQLSTATE[42S22]: Column not found」などのエラーが出たときの確認するポイント
CakePHP3で「SQLSTATE[23000]: Integrity constraint violation」「SQLSTATE[42S22]: Column not found」などのエラーが出たときの確認するポイント

CakePHP3の開発で発生する「SQLSTATE[23000]: Integrity constraint violation」「SQLSTATE[42S22]: Column not found」のエラーには特有の原因もあるため、その説明と対処方法の解説。