こんにちは!Webエンジニアをしている南です。
CakePHPを初めて使用している時に、よくEntityってどんな時によく使うのだろう?とか。
Entityにはどんなコードを書くのが良いのかなあ?っと悩んだことはありませんか?
僕は結構思っていました。
そこで、今回はCakePHPのEntityについて紹介していきます。
この記事で紹介しているCakePHPのバージョンは3系です。
CakePHPのEntityとは
Photo by Tim Mossholder on Unsplash
CakePHPで使用しているEntityは公式のドキュメントでは、下記のように紹介されています。
エンティティーは保持するデータにアクセスして 操作するための永続的なプロパティーとメソッドを保有しています。
Entityが使用されるタイミング的には、CakePHPで下記のようなコードを書いた時です。
1 2 3 4 5 6 7 |
// getメソッドで個別のレコードを取得してきた時 $user = $this->Users->get(1); // patchEntityでデータをEntityに反映した時など $user = $this->users->patchEntity($user, $this->getRequest()->getData(), [ 'validate' => 'register' ]); |
Entityの使いどころについて
Photo by Matt Ridley on Unsplash
公式ドキュメントを見る限り、色々な使い方ができるようです。
ただ、この記事では普段僕が使っている用途に絞って紹介していきます。
僕は普段下記のような用途で使用しています。
・各テーブルで取得したデータの振る舞いを表現する時
・各データが何を表しているのかをまとめておきたい時
また、個人的にCakePHPのTableクラスが主にDBでのデータの取得方法を記述して、Entityではその取得してきたデータの振る舞いを記述する場所だと思っています。
各テーブルで取得したデータの振る舞いを表現する時
よく使う用途としては、Tableクラスで取得したデータの振る舞いを表現する時に使います。
例えば、下記のような感じです。
1 2 3 4 5 6 7 |
$user = $this->Users->get(1); if ($user->isPremiumUser()) { // プレミアム会員用の処理 } else { //普通の会員の処理 } |
上記のコードでは、isPremiumUser()を使ってプレミアム会員かどうかを判断しています。
Entityでは、各テーブルで定義したデータがどんな処理を行うのかを定義したい時にその定義をEntityクラスに記載することで、Usersテーブルではこんな処理をしますよということを表現できます。
上記の場合では、実際にEntityに下記のように処理を書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php namespace App\Model\Entity; class User extends Entity { /** * Userがプレミアム会員かどうかを判断する処理 * @return bool */ public function isPremiumUser(): bool { return $this->_properties['member_type'] === 1; } } |
また、上記のコードは下記のように書くことも可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php namespace App\Model\Entity; class User extends Entity { /** * Userがプレミアム会員かどうかを判断する処理 * @return bool */ public function _geIsPremiumUser(): bool { return $this->_properties['member_type'] === 1; } } |
上記の場合は、下記のように書き方が変化します。
Cakeでは下記の用途も見るので、ぜひ覚えておいてください。
1 2 3 4 5 6 7 |
$user = $this->Users->get(1); if ($user->is_premium_user) { // プレミアム会員用の処理 } else { //普通の会員の処理 } |
各データが何を表しているのかをまとめておきたい時
もう1つよく使う用途としては、各データが何を表しているのかをまとめておきたい時にこのEntityクラスを使用します。
上の方で記載した下記コードについて、数字の1が何を表しているのか初見だと具体的ではないので、少し混乱すると思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php namespace App\Model\Entity; class User extends Entity { /** * Userがプレミアム会員かどうかを判断する処理 * @return bool */ public function _geIsPremiumUser(): bool { return $this->_properties['member_type'] === 1; } } |
上記の場合は、まだシンプルですが、そのうち1の他に2や3とか出てきたら、少し混乱してくると思いませんか?
上記のような数字をプログラミングでは、マジックナンバーと言います。
マジックナンバーとは、ソースコードに直に記載された数字のことで、その数字の意味が書いた本人以外の人から見ると具体的ではないことを意味します。
下記の場合は、メソッドから推測できるので、まだわかりやすいかもしれません。
1 2 3 4 5 6 7 |
$user = $this->Users->get(1); if ($user->isPremiumUser()) { // プレミアム会員用の処理 } else { //普通の会員の処理 } |
でも例えば、下記のような場合はどうでしょうか?
1 2 3 4 |
$memberType = $this->getRequest()->getData('member_type'); if ($memberType === 1) { } |
まず、1って何だ?と思うと思います。
そんな時、MemberTypeEntityに下記のように記載して、MemberTypeEntityを使うことで、上記よりは具体的にコードを見た人に意図を伝えることができると思います。
1 2 3 4 5 6 7 8 |
<?php namespace App\Model\Entity; class MemberType extends Entity { public const MEMBER_TYPE_PREMIUM = 1; } |
MemberTypeEntityで記載した定数を使用して、下記のように変更します。
1 2 3 4 5 |
$memberType = $this->getRequest()->getData('member_type'); if ($memberType === MemberTypeEntity::MEMBER_TYPE_PREMIUM) { } |
まだ、最初のやつよりマシだと思いませんか。。。?
僕はEntityには、こうやってデータが何を表しているのかをまとめておきたい時に使用したりします。
まとめ
今回は、僕が普段CakePHPのEntityを使っている時の用途について紹介しました。
この記事がEntityってどういう時に、使うのだろうと思っている人の約に立てれば幸いです。
他の使用方法などについて、気になる方はぜひ下記の公式ドキュメントも覗いてみてください。