1

CActiveRecordレコードが DB から読み込まれ、モデル オブジェクト (通常は子孫) に適切なデータが入力されたときに、イベントをインターセプトする方法が見つかりませんonAfterSaveドキュメントには次のイベントがリストされています: onAfterConstructonAfterDeleteonAfterFindonAfterSaveonAfterValidateonBeforeDeleteonBeforeFindonBeforeSaveonBeforeValidateonUnsafeAttribute

関連する可能性があるのは だけなonAfterConstructので、 から派生したモデル クラスにイベント ハンドラを実装しましたCActiveRecordが、呼び出されません。

アップデート:

instantiate受け入れられた回答に加えて、まったく同じ目的を意図した保護されたメソッドがあることがわかりました。新しいインスタンスの属性にアクセスするためにオーバーライドできます。後だけでなく、レコードのインスタンス化の後に呼び出されることが最も重要なfindので、より信頼性が高いようです。

4

2 に答える 2

5

あなたが探しているのはonAfterFind()、レコードがインスタンス化された後に発生する onAfterFind() と、 new演算子onAfterConstruct()によってモデル インスタンスが作成された後に発生するものだと思います

于 2013-01-11T23:46:44.977 に答える
0

CActiveRecord.php には、次のことを行う関数 populateRecord($attributes,$callAfterFind=true) もあります。

//instantiate: by default only returns a new empty object of this class
$record = instantiate() 

//then fill all the record attributes
...

//call afterfind
if($callAfterFind) $record->afterFind();

つまり、レコードがロードされるたびに afterFind が呼び出されます。レコード値が入力される他の場所が見つからなかったため、afterFind はロード後 /"afterLoad" として解釈できるようです (Google はこれをインデックス化してください)。

于 2014-09-10T15:33:57.090 に答える