投稿日:

イベントシステムについて今更勉強した件

CakePHP4の使い方をあれこれ探っているときに、上司から「論理削除したとき、deletedカラムにもタイムスタンプが立つようにして」と言われたのが事の発端でした。
CakePHPには前からsoftDeleteなるプラグインが存在していて、それがタイムスタンプを立てることは知ってたんです。そんでも、プラグインをやたら増やしたくないという方針もあったため、何とか今あるものだけでdeletedカラムにタイムスタンプを立てようとしておりました。そうなると、TimeStampBehaviorの出番だろうと思い至ったわけです。今まで既存のコールバック(beforeSave)に対してタイムスタンプを置いていたわけだから、どうやって他のタイムスタンプを立てるタイミングを決めるのやら結構勉強が必要でした。

逆に言うと、勉強の時間が大半で、数行いじったらすぐできてしまったことにびっくりしているんです。
イベントをTimeStampビヘイビアに発行するナニカが必要なだけだったというオチで、最初にイベントリスナから組む長い長い道のりを覚悟していて肩透かし。

イベント発行って、こんだけでいいんですね

$event = new Event('Model.beforeDelFlag',$this,['entity' => $entity]);
$this->getEventManager()->dispatch($event);

TimeStampは内部的にイベントを全部観測していて、イベント名が設定のキーと同じ名前のものが発行されたとき、その下に設定されたタイムスタンプに適切に現在時刻を立てる…こういうことだったんだなと。

イベント名の命名規則は、層.(クラス.)イベント という具合だとか、リスナの書き方とか、まだイベントシステムを完全に理解したわけではないけれど、これを論理削除メソッドに埋め込んだらタイムスタンプ押してくれるようになった、という具合。これを他でどう使うかはまだイベントリスナ含め思いついていないですけれども、もしかしたらこれがまた仕事場の常識を塗り替えるような改善を生み出す可能性は無きにしも非ず…。

とりあえず今のところは、イベントの発行方法だけでも分かったことでよし、と思ってます。

ディスパッチという言い方がわかりにくいのねん…「発行」とか「発令」と訳語を当ててくれたらええのに…。