Transfer Event Model とは、なんだろうか。
データベースのテーブルをマッピングした Transfer オブジェクト経由でデータベース上のデータに対してなんらかの変更が加えられた(もしくは、変更が加えられる)ことを監視して、処理を発生させることができるということのようだ。
処理を発生させることができるタイミングとしては、AfterNew、BeforeCreate、AfterCreate、BeforeUpdate、AfterUpdate、BeforeDelete、AfterDelete とあるので、オブジェクト新規作成後、データベースへの挿入前、挿入後、更新前、更新後、削除前、削除後となるだろうか。
そして、発生させる処理の関数名は、それらタイミングによって、決められている。
オブジェクト新規作成後であれば、actionAfterNewTransferEvent などとなっている。
Transfer フレームワークに observer を登録する関数もそれぞれで異なっている。addAfterNewObserver など。
実装の仕方
●イベントモデル(observer)の作成。
/ shopping / model / observer / EventModel.cfc
とりあえず、空コンポーネント。
<cfcomponent displayname="EventModel" output="false">
<cfprocessingdirective pageencoding="UTF-8" />
</cfcomponent>
●Bean 設定
ColdSpring.xml
<bean id="observer" class="&topOfPackage;.model.observer.EventModel" />
●モデルコンポーネントに AutoWire setter 関数追加
<cffunction name="setObserver" access="public" returntype="void" output="false">
<cfargument name="observer" type="shopping.model.observer.EventModel" required="true">
<cfset variables.observer = arguments.observer />
</cffunction>
●モデル上で Transfer に observer 登録
例として、Transfer オブジェクト新規作成後監視処理を追加。
<cfset variables.transfer.addAfterNewObserver(variables.observer) />
この追加処理は、AutoWire タイミングの関係で、モデルコンポーネントの初期化時や、AutoWire の setter 関数の中には、入れることはできない。
もちろん、AutoWire ではなく、Bean の初期化コードを書けば、その限りではないだろう。
CartProcess.cfc の insertItem 関数の中に、上記の一行を追加した。
●observer に所定の関数実装
動きを見たいだけなので、ログを書き出すだけの処理。
<cffunction name="actionAfterNewTransferEvent" hint="Actions an event before a create happens" access="public" returntype="void" output="false">
<cfargument name="event" hint="The event object" type="transfer.com.events.TransferEvent" required="Yes">
<cfset var message = arguments.event.getTransferObject().getClassName() />
<cflog application="yes" text="#message#:new" type="information" file="shoppinglog">
</cffunction>