Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Organization

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

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

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

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

そんな時は Entityアクセサー が便利です :sunglasses:
以下のように_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したのに、その値が古くて使えないなんて~ :dizzy_face:
「これは困った・・・」
「税込み価格をDBには保存せず表示する時に計算してあげれば行けそうだけど、表示するたびに計算はやだなぁ。。」

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

こんな感じです。

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

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

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

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

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

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

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

こんな感じです。

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

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

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

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

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
1
Help us understand the problem. What are the problem?