1

当从数据库加载记录并且模型对象(通常是后代)填充了适当的数据时,我找不到拦截事件的方法CActiveRecord- 这与onAfterSave. 文档列出了以下事件:onAfterConstruct, onAfterDelete, onAfterFind, onAfterSave, onAfterValidate, onBeforeDelete, onBeforeFind, onBeforeSave, onBeforeValidate, onUnsafeAttribute.

唯一可能相关的是onAfterConstruct,所以我在派生自的模型类中实现了事件处理程序CActiveRecord,但它没有被调用。

更新:

除了接受的答案之外,我发现还有一个受保护的方法instantiate,它的目的是相同的。它可以被覆盖以访问新实例的属性。最重要的是在记录的任何实例化之后调用它,而不仅仅是在 之后find,因此它似乎更可靠。

4

2 回答 2

5

我认为您正在寻找的是onAfterFind(), onAfterFind() 在实例化记录后 onAfterConstruct()引发,而在模型实例由new运算符创建后引发

于 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”(谷歌请索引这个)

于 2014-09-10T15:33:57.090 回答