当从DB加载记录并且模型对象(通常是CActiveRecord
后代)用适当的数据填充时,我找不到拦截事件的方法 - 这与{{1}相似}。 documentation列出以下事件:onAfterSave
,onAfterConstruct
,onAfterDelete
,onAfterFind
,
onAfterSave
,onAfterValidate
,onBeforeDelete
,onBeforeFind
,onBeforeSave
,onBeforeValidate
。
唯一可能相关的是onUnsafeAttribute
,所以我在从onAfterConstruct
派生的模型类中实现了事件处理程序,但它没有被调用。
更新
除了接受的答案之外,我还发现有一种受保护的方法instantiate
,其用途与目的相同。可以重写它以访问新实例的属性。最重要的是,在记录的任何实例化之后调用它,不仅在CActiveRecord
之后,所以它似乎更可靠。
答案 0 :(得分:5)
我认为你要找的是onAfterFind()
,onAfterFind()是在实例化记录之后引发的,vs onAfterConstruct()
是在 new 运营商
答案 1 :(得分:0)
在CActiveRecord.php中你也有 function 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”之后(谷歌请索引这个)