网站首页 laravel框架
model-注入一个观察者模式
发布时间:2019-08-30 02:25查看次数:3230
应用场景->被动关联事件触发操作
比如:创建一个用户->附属表被动创建附属信息/删除 等
所有支持的模型事件
在 Eloquent 模型类上进行查询、插入、更新、删除操作时,会触发相应的模型事件(关于事件我们后面会单独讲),不管你有没有监听它们。这些事件包括:
方法名 | 说明 |
---|---|
retrieved | 获取到模型实例后触发 |
creating | 插入到数据库前触发 |
created | 插入到数据库后触发 |
updating | 更新到数据库前触发 |
updated | 更新到数据库后触发 |
saving | 保存到数据库前触发(插入/更新之前,无论插入还是更新都会触发) |
saved | 保存到数据库后触发(插入/更新之后,无论插入还是更新都会触发) |
deleting | 从数据库删除记录前触发 |
deleted | 从数据库删除记录后触发 |
restoring | 恢复软删除记录前触发 |
restored | 恢复软删除记录后触发 |
注:批量更新时不会触发相应事件,因为是直接走查询构建器完成的,绕过了模型方法。
通过监听这些事件,我们可以在 Eloquent 模型实例生命周期的特定阶段执行特定操作。在 Laravel 中我们有多种方式来监听模型事件。
通过观察者监听模型事件
针对模型事件这种特殊的事件类型,
Laravel
还为我们提供了观察者类来处理模型事件的监听。观察者可以看作是上述订阅者处理模型事件的简化版本,我们不需要自定义事件类,不需要建立映射关系,只需要在观察者类中将需要监听的事件定义为同名方法,并在相应方法中编写业务处理代码即可。当某个模型事件触发时,Eloquent 底层会去该模型上注册的观察者类中通过反射查找是否定义了对应的方法,如果定义了则执行相应的逻辑,否则忽略。
下面我们以saving
和saved
事件为例演示如何通过观察者监听模型事件。
首先,我们通过 Artisan命令初始化针对 User 模型的观察者: php artisan make:observer UserObserver --model=User 默认生成的 UserObserver 会为 created、 updated、deleted、restored、forceDeleted(强制删除) 事件定义一个空方法: 你可以把前面定义的retrived、deleting、deleted 事件监听代码迁移过来, 也可以将不需监听的事件方法移除,这里我们将编写保存模型时涉及的模型事件, 包括 saving、creating、updating、updated、created、saved:
<?phpnamespace App\Observers;use App\User;use Illuminate\Support\Facades\Log;class UserObserver{ public function saving(User $user) { Log::info('即将保存用户到数据库[' . $user->id . ']' . $user->name); } public function creating(User $user) { Log::info('即将插入用户到数据库[' . $user->id . ']' . $user->name); } public function updating(User $user) { Log::info('即将更新用户到数据库[' . $user->id . ']' . $user->name); } public function updated(User $user) { Log::info('已经更新用户到数据库[' . $user->id . ']' . $user->name); } public function created(User $user) { Log::info('已经插入用户到数据库[' . $user->id . ']' . $user->name); } public function saved(User $user) { Log::info('已经保存用户到数据库[' . $user->id . ']' . $user->name); } }
关键字词:laravel##