25
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

CakePHP3 Entityのset/getについて

Last updated at Posted at 2015-06-10

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が発動することでうまく動作しない場合はメンバ変数を利用して処理を制御するなどの工夫が必要かと思います。

いずれにしてもかなり便利なのでどんどん使って行けるといいと思います!

25
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?