CakePHP3 Entityのset/getについて
CakePHP2までの便利な機能の一つにafterFindというものがありましたが、CakePHP3では使用ができなくなっています。
その代わりとしてCakePHP3では便利な機能としてEntityにset/getという機能が準備されています。
set
setはEntityにセットするタイミングで発動します。
// Entity
protected function _setTitle($title)
{
// entityをセットするタイミングでtitleというフィールドがあれば処理
return $title;
}
// Table
$data = [
'title' => 'title',
];
$entity = $this->newEntity($data);
get
getはEntityを呼び出すタイミングで発動します。
// Entity
protected function _getTitle($title)
{
// entityをよびだすタイミングで処理
return $title;
}
<!-- Viewなど-->
<?= $entity->title;?>
CakePHP2以前のvirtualFieldsに該当するような処理もここで行えます。
応用
上記基本の使用方法だと各Entityにメソッドを作成しないと使用できません。
プラグインなどで任意のフィールドを指定してgetやsetを発動させるには、大元のCake\ORM\Entity
のsetやgetをオーバーライドする必要があります。
// Entity
// &getメソッドをoverride
public function &get($property)
{
$value = parent::get($property);
// propertyとvalueを利用して処理する
return $value;
}
// setメソッドをoverride
public function set($property, $value = null, array $options = [])
{
parent::set($property, $value , $options);
// $thisにEntity情報が含まれているのでそれを利用して処理
return $this;
}
注意すること
getやsetが片方だけの場合はそこまで影響はないですが、両方オーバーライドをする必要がある場合、set内で値を取り出すと(当然ですが)getが発動します。
どうしてもset内でgetが発動することでうまく動作しない場合はメンバ変数を利用して処理を制御するなどの工夫が必要かと思います。
いずれにしてもかなり便利なのでどんどん使って行けるといいと思います!