CakePHP5 モデル の メソッド・定数 どこに書く?
CakePHPはモデルがTableとEntityに分かれています。別のフレームワークではモデルが1つのことが多かった。さて、どうしようか。
テーブルオブジェクト がオブジェクトのコレクションへのアクセスを表し、提供するのに対し、 エンティティーは個々の行やドメインオブジェクトを表します。エンティティーは保持するデータにアクセスして 操作するための永続的なプロパティーとメソッドを保有しています。
、、となると、エンティティかな。定数はテーブルかな。
ただ、DB仕様変更が多いから、bin/cake bake model … で、チャチャっと更新したい。なので、エンティティに書くのは最小限にしたいなぁ。できれば1か所にまとめたいなぁ。
ということで、
CRUD の R のみ ならエンティティ
「レコードの状態から判定する」とか「アラート表示をつくる」とかの「データ更新を伴わないもの」はエンティティ
- コントローラーやビューで短いコードで済む
ほかは ビヘイビア
「定数」「レコードの取得、更新」「DBのトリガ的なコード」とかはビヘイビア
- できるだけモデル単位で1か所にまとめたい
- bake model でジャンジャン上書きしても差分編集が楽ちん
ということにしました。
ビヘイビアをつくる
まずは、bake。
bin/cake bake behavior [ModelName]
ビヘイビア編集
<?php
class ModelNameBehavior extends Behavior
{
//固定値
public const STATE_DONE = 'done';
protected array $_defaultConfig = [];
public function initialize(array $config): void
{
}
//update前の補完等はここに
public function beforeSave(EventInterface $event, EntityInterface $entity, ArrayObject $options)
{
}
//update後のデータ編集はここに
public function afterSave(EventInterface $event, EntityInterface $entity, ArrayObject $options)
{
}
}
テーブルにビヘイビア追加
$this->addBehavior('Timestamp');
$this->addBehavior('ModelNameBehavior');
イベントはこれだけある
Model.initialize
Model.beforeMarshal
Model.afterMarshal
Model.beforeFind
Model.buildValidator
Model.buildRules
Model.beforeRules
Model.afterRules
Model.beforeSave
Model.afterSave
Model.afterSaveCommit
Model.beforeDelete
Model.afterDelete
Model.afterDeleteCommit
あと…
考えたら当たり前なんだけど、テーブルのバリデーションが完了してから、ビヘイビアのbeforeSave、afterSave と着火する。デバッグ時には、どうもビヘイビアを一番に疑ってしまうので、忘備録。
ビヘイビアに、別テーブルへの書き込みを書く場合…
設計としてはあんまりよろしくないんだろうけど「開発スピード&メンテ楽する」を最優先!
更新の方向(順番)を決めておこう。
何も考えずにやっていると、デッドロックしちゃうよ~。
やり過ぎてスパゲッティにならないようにね。
Discussion