普段Laravelを使っていて、CakePHPでデータベースにエンティティを通して値を保存するというシーンでハマったのでそれぞれのフレームワークの仕様の違いを紹介します。
CakePHPにおけるアクセサ/ミューテータの仕様
Cake/ORM/Table::_processSave()
=> Cake/ORM/Entity::extract()
=> Cake/Datasource/EntityTrait::extract()
=> Cake/Datasource/EntityTrait::get()
Cakephp3でCake/ORM/Table::save()
を呼ぶと_processSave()
メソッドが呼ばれますが、この中でエンティティのプロパティをSQL文にバインドする時に、エンティティクラス内にユーザー定義のアクセサがある場合、それによって値がフォーマットされます。
CakePHPではアクセサとミューテーターは、オブジェクト指向でいうアクセサやミューテータそのもので、エンティティのプロパティの参照時にアクセサが呼ばれ、束縛時にミューテータが呼ばれる仕様です。
Laravelにおけるアクセサ/ミューテータの仕様
Laravelでは、モデルの"データベースから取ってきたプロパティ"の参照時にアクセサが呼ばれ、モデルのプロパティをデータベースに保存する際ミューテータが呼ばれるという仕様です。
すなわちデータベースに値を出し入れする際に、CakePHPとLaravelのアクセサとミューテータは互いに正反対の動作をするということです。