知っていると便利なCakePHP3のEntity


今さら感はありますが CakePHP3Entity について便利だと思う機能について書いてみます。

この Entity について、あまりよく分かっておらず取り敢えず用意してるだけ。という人は結構多いのではないでしょうか?
そんな方達にとって、この記事が有益になってくれたら幸いです。

突然ですがこんなケースはありませんか?
・アカウント登録画面で入力したパスワードを自動でハッシュ化してsaveしてあげたい
・入力した商品の価格を自動的に税込み価格にしてsaveしてあげたい

そんな時は Entityアクセサー が便利です
以下のように_set + フィールド名のキャメルケース という命名ルールで Entity 内に設定してあげると、
save時に自動でハッシュ化や税込み価格の計算をしてくれるようになります。

// Entity
namespace App\Model\Entity;
use Cake\ORM\Entity;

class User extends Entity
{
    // パスワードハッシュ
    protected function _setPassword($password)
    {
        if (strlen($password) > 0) {
          return (new DefaultPasswordHasher)->hash($password);
        }
    }

    // 商品の税込み価格
    protected function _setPrice($price)
    {
        if ($price > 0) {
          return = $price * 1.10;
        }
    }
}


こんな感じですね。
毎回いちいち計算してセットしなくていいから便利ですねー。

と、ここで「税率変わったらどうするの?」と疑問に思われた方もいるのではないでしょうか?
その通りです。

「せっかく税込み計算してDBにsaveしたのに、その値が古くて使えないなんて~
「これは困った・・・」
「税込み価格をDBには保存せず表示する時に計算してあげれば行けそうだけど、表示するたびに計算はやだなぁ。。」

そこで登場するのが ミューテーター です!
この ミューテーター を使えば、セットされるプロパティーをカスタマイズする事ができるようになるのです。
ミューテーター は、_get + フィールド名のキャメルケースという命名ルールで Entity 内に設定してあげます。

こんな感じです。

    // 商品の税込み価格
    protected function _getPrice($value)
    {
        $taxprice = $value * 1.08;
        return floor($taxprice);
    }

上記のように設定して、テンプレート内でよくやるように

<?= h($user->price) ?>

とするだけで、勝手に ミューテーター がカスタマイズしてくれるのです。
これまた便利ですね。

こんな感じで Entity には便利な機能がたくさんあります。
ここでは全部書き切れませんが、最後にもう一つ、仮想プロパティーの生成 について紹介させて頂きます。

仮想プロパティーの生成・・??「何のことだ?」となった方、安心してください。
CakePHP2 にあったバーチャルフィールドの事です。

例えば「都道府県」、「市区町村」、「丁目番地」をDBに登録していたとします。
それを登録内容確認画面で表示する際に住所として横並びで表示したいって時に 仮想プロパティーの生成 が便利です。

こんな感じです。

    // 住所表示用
    protected function _getAddress()
    {
        $address = $this->_properties['prefecture'] . ' ' . $this->_properties['city'] . ' ' . $this->_properties['home'];
        return $address;
    }

機能自体は アクセサー なのですが、存在していないフィールド名で設定してあげて、
その中で「都道府県」、「市区町村」、「丁目番地」のフィールドをくっつけてあげます。
そして、ビューで以下のようにしてあげると

<?= h($user->address) ?>

連結した状態で表示されるのです。
これも便利ですねー

以上、Entity の紹介でした。
例が微妙だったかもしれないですが少しでも皆様の助けになれば幸いです。

※まだまだ Entity について知りたい!という方は本家ページもどうぞ!
https://book.cakephp.org/3/ja/orm/entities.html