企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] # 详解 ``` • creating - 对象已经 ready 但未写入数据库 • created - 对象已经写入数据库 • updating - 对象已经修改但未写入数据库 • updated - 修改已经写入数据库 • saving - 对象创建或者已更新但未写入数据库 • saved - 对象创建或者更新已经写入数据库 • deleting - 删除前 • deleted - 删除后 • restoring - 恢复软删除前 • restored - 恢复软删除后 ``` 依次是 saving>creating>created>saved。 update 同理就不具体贴代码了, saving>updating>updated>saved。 而 delete 不涉及 save,因此依次只触发了 deleting 和deleted。 当 restore 软删除记录时触发了 restoring 和 restored 方法。 Eloquent模型可以触发事件,允许你在模型生命周期中的多个时间点调用如下这些方法:creating, created, updating, updated, saving, saved,deleting, deleted, restoring, restored。事件允许你在一个指定模型类每次保存或更新的时候执行代码。 一个新模型被首次保存的时候,creating和created事件会被触发。如果一个模型已经在数据库中存在并调用save方法,updating/updated事件会被触发,无论是创建还是更新,saving/saved事件都会被调用. deleting和deleted很好理解,在删除模型时触发,deleting在删除操作前执行,deleted在删除完成后执行。 当创建模型时,依次执行saving、creating、created和saved,同理在更新模型时依次执行saving、updating、updated和saved。无论是使用批量赋值(create/update)还是直接调用save方法,都会触发对应事件(前提是注册了相应的模型事件)。 # 服务提供者写 你可以在任何你喜欢的地方注册模型事件,这里我们选择在服务提供者AppServiceProvider的boot方法中注册: ``` //注意命名空间 Post::saving(function($post){ echo 'saving event is fired<br>'; }); Post::creating(function($post){ echo 'creating event is fired<br>'; }); Post::created(function($post){ echo 'created event is fired<br>'; }); Post::saved(function($post){ echo 'saved event is fired<br>'; }); ``` 然后只有有对应的操作就会触发这边 # Tratis 核心就是trait里面有个boot+trait名,laravel在启动的时候会检测,并把他放在服务容器里面 用traits的话,用的时候use下就好了 比如在一个网站上用户有活动记录的,那么我们把他记录下来 Activity表 | 键名 | 类型 | | --- | --- | | id | PK | | user_id | FK posts's id | | conversation_id | 多态关联的主键id | | conversation_type | 多态关联的命名空间 | | created_at | timestamp | | updated_at | timestamp | 然后比如用户新增一篇文章,我们要把他的行为记录下来 写个trait RecordActivity.php ``` namespace App\Models; trait RecordActivity { /** * 命名是boot+traits的名字 * 这样写laravel在启动项目的时候会为我们自动执行这个方法 */ public static function bootRecordActivity() { foreach (static::getModelEvents() as $event) { static::$event(function ($model){ //生成相应数据,把数据写到Activity这个表里面 $model->recordActivity(); }); } } protected static function getModelEvents() { //判断用户有没有定义相关的属性 if (isset(static::$recordEvents)){ return static::$recordEvents; } return ['created'];//你也可以加上其他的事件 比如updated } public function recordActivity() { Activity::create([ 'user_id'=>1, //这边测试就写个1,可以写\Auth::id() 'conversation_id'=>$this->id, 'conversation_type'=>get_class($this), ]); } } ``` 一旦use这个trait,他会自动执行,一旦有created的事件发生(可以在里面自己定义) 自己定义就定义下这个属性就好了 `static::$recordEvents` 他就不会用created了 Activity.php 活动模型 ``` public function conversation() { return $this->morphTo(); } ``` User.php用户模型 ``` public function activities() { return $this->hasMany(Activity::class); } ``` Post模型,让post一旦有created就触发写好的 ``` use RecordActivity; ``` 我们开始试下 ``` $post=\App\Models\Post::create(['title'=>'new1']); return $post; ``` 这样我们可以看到Activities表中有活动记录了 如果我们要查一个用户的活动记录 ``` $user=\App\Models\User::find(1); $activity=$user->activities->toArray(); return $activity; ``` 我们就可以看到用户在Activity表中的记录了 如果我们要查一个用户,我们可以在用户表中写对应的关联 user.php中写 ``` public function activities() { //这边的conversation就是activity模型的方法名 return $this->hasMany(Activity::class)->with('conversation'); } ``` 然后我们测试下 ``` $user=\App\Models\User::find(1); $activity=$user->activities; return $activity; ``` # 简单粗鲁(用于本地测试) 路由中定义: ~~~ Event::listen('eloquent.updated: App\Post',function (){ dump('测试一下修改事件'); }); Route::post('/post/{id}', 'PostController@update'); ~~~ http://blog.csdn.net/a_new_steven/article/details/73604846