0
0

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

Posted at

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

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

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

ただ、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

あと…

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

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

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

0
0
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
0
0