👌

CakePHP5 モデル の メソッド・定数 どこに書く?

2024/01/24に公開

CakePHPはモデルがTableとEntityに分かれています。別のフレームワークではモデルが1つのことが多かった。さて、どうしようか。

テーブルオブジェクト がオブジェクトのコレクションへのアクセスを表し、提供するのに対し、 エンティティーは個々の行やドメインオブジェクトを表します。エンティティーは保持するデータにアクセスして 操作するための永続的なプロパティーとメソッドを保有しています。

https://book.cakephp.org/5/ja/orm/entities.html#namespace-Cake\ORM

、、となると、エンティティかな。定数はテーブルかな。

ただ、DB仕様変更が多いから、bin/cake bake model … で、チャチャっと更新したい。なので、エンティティに書くのは最小限にしたいなぁ。できれば1か所にまとめたいなぁ。

ということで、

CRUD の R のみ ならエンティティ

「レコードの状態から判定する」とか「アラート表示をつくる」とかの「データ更新を伴わないもの」はエンティティ

  1. コントローラーやビューで短いコードで済む

ほかは ビヘイビア

「定数」「レコードの取得、更新」「DBのトリガ的なコード」とかはビヘイビア

  1. できるだけモデル単位で1か所にまとめたい
  2. 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

https://book.cakephp.org/5/ja/orm/table-objects.html#table-callbacks

あと…

考えたら当たり前なんだけど、テーブルのバリデーションが完了してから、ビヘイビアのbeforeSave、afterSave と着火する。デバッグ時には、どうもビヘイビアを一番に疑ってしまうので、忘備録。

ビヘイビアに、別テーブルへの書き込みを書く場合…

設計としてはあんまりよろしくないんだろうけど「開発スピード&メンテ楽する」を最優先!
更新の方向(順番)を決めておこう。
何も考えずにやっていると、デッドロックしちゃうよ~。
やり過ぎてスパゲッティにならないようにね。

Discussion