多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 事件操作 ### [](https://octobercms.com/docs/database/model#events)Events 模型会引发多个事件,使您可以陷入模型生命周期的各个阶段。通过事件,您可以在每次在数据库中保存或更新特定模型类时轻松地执行代码。通过覆盖类中的特殊方法来定义事件,可以使用以下方法覆盖: | 事件 | 描述 | | --- | --- | | **beforeCreate** | 在模型保存之前(首次创建时)。 | | **afterCreate** | 保存模型后,首次创建时。 | | **beforeSave** | 在保存模型(创建或更新)之前。 | | **afterSave** | 保存模型后,创建或更新模型。 | | **beforeValidate** | 在验证提供的模型数据之前。 | | **afterValidate** | 在验证提供的模型数据之后。 | | **beforeUpdate** | 保存现有模型之前。 | | **afterUpdate** | 保存现有模型后。 | | **beforeDelete** | 在删除现有模型之前。 | | **afterDelete** | 删除现有模型后。 | | **beforeRestore** | 在恢复软删除的模型之前。 | | **afterRestore** | 恢复软删除的模型后。 | | **beforeFetch** | 在填充现有模型之前。 | | **afterFetch** | 在填充现有模型之后。 | 使用事件的示例: ~~~ /** * Generate a URL slug for this model */ public function beforeCreate() { $this->slug = Str::slug($this->name); } ~~~ > **注意:**如果尚未提交使用[延迟绑定](https://octobercms.com/docs/database/relations#deferred-binding)创建的关系(即文件附件),则在`afterSave`模型事件中将不可用它们。要访问未提交的绑定,请`withDeferred($sessionKey)`在关系上使用方法。例:`$this->images()->withDeferred(post('_session_key'))->get();` ### [](https://octobercms.com/docs/database/model#basic-usage)基本用法 每当首次保存新模型时,`beforeCreate`和`afterCreate`事件就会触发。如果数据库中已经存在模型并且`save`调用了该方法,则`beforeUpdate`/`afterUpdate`事件将触发。但是,在两种情况下,`beforeSave`/`afterSave`事件都会触发。 例如,让我们定义一个事件侦听器,该事件侦听器在首次创建模型时填充slug属性: ~~~ /** * Generate a URL slug for this model */ public function beforeCreate() { $this->slug = Str::slug($this->name); } ~~~ `false`从事件返回将取消`save`/`update`操作: ~~~ public function beforeCreate() { if (!$user->isValid()) { return false; } } ~~~ 可以使用`original`属性访问旧值。例如: ~~~ public function afterUpdate() { if ($this->title != $this->original['title']) { // title changed } } ~~~ 您可以使用方法在外部绑定到模型的单个实例的[本地事件](https://octobercms.com/docs/services/events)`bindEvent`。事件名称应与方法覆盖名称相同,并以开头`model.`。 ~~~ $flight = new Flight; $flight->bindEvent('model.beforeCreate', function() use ($model) { $model->slug = Str::slug($model->name); }) ~~~