laravel学习笔记--模型事件
xuexi 2024-02-01 10:13:54 发表在:PHP 查看数:711

在使用模型的时候,会触发模型事件, 其中允许挂接到模型生命周期的如下节点:

retrieved 从数据库中查找数据时触发
creating
created
updating
updated
saving
saved
deleting
deleted
restoring
restored
例如,我在Blog模型中去使用模型事件

/**
     * 模型的 "booted" 方法
     *
     * @return void
     */
    protected static function booted()
    {
        /**
         * 模型删除事件
         */
        static::deleted(function ($blog) {
            info('删除了博客:' . $blog->title);
        });
    }
然后,在控制器中使用模型去删除数据

Blog::destroy(12);
这样就会就会触发模型事件

观察者
定义观察者

如果在一个模型上监听了多个事件,可以使用观察者来将这些监听器组织到一个单独的类中。观察者类的方法名映射到你希望监听的 Eloquent
事件。 这些方法都以模型作为其唯一参数

生成新的观察者类,如果是第一次创建,会在app目录创建一个新目录observer

php artisan make:observer BlogObserver --model=Blog
当然,只是生成了还不能使用,还要去注册这个服务才可以使用

在服务提供者的 boot 方法注册观察者。目录是在app\Providers\AppServiceProvider.php
下面是在 AppServiceProvider 中注册观察者的示例

 public function boot()
    {
       //注册观察者
        Blog::observe(BlogObserver::class);
    }
好了,定义完和注册完就可以去使用观察者了
例如,我在观察者中去使用模型删除触发的事件

public function deleted(Blog $blog)
    {
        info('使用观察者删除了博客:' . $blog->title);
    }
然后在控制器中去使用模型删除数据

Blog::destroy(18);
然后就会触发删除事件了
在这里插入图片描述

禁用事件
可能偶尔希望暂时「禁用」模型触发的所有事件。 可以使用withoutEvents方法来实现。 withoutEvents方法接受闭包作为唯一的参数。在此闭包中执行的任何代码都不会触发模型事件

以下代码将获取并删除一个 App\Models\User 实例,而不会触发任何模型事件。 给定闭包返回的任何值都将通过
withoutEvents 方法返回

use App\Models\User;

$user = User::withoutEvents(function () use () {
    User::findOrFail(1)->delete();

    return User::find(2);
});
保存单个模型并禁用事件
可能希望「保存」给定的模型而不会触发任何事件。 您可以使用saveQuietly 方法完成此操作

$user = User::findOrFail(1);

$user->name = 'Victoria Faith';

$user->saveQuietly();
最近访问时间:2025-01-18 14:43:28
知识库:318条鸣谢:TAY  备案号:蜀ICP备2024090044号