【问题标题】:Eloquent model boot events never triggeredEloquent 模型启动事件从未触发
【发布时间】:2020-06-07 02:56:16
【问题描述】:

我无法让模型启动事件工作。这是最基本的 Eloquent 功能,所以我确信这可能是我在这里搞砸的简单事情。

当我运行这段代码时:

User::create(['email'=>'test@example.com']);

或者这个代码:

(new User)->fill(['email'=>'test@example.com'])->save();

然后我希望在模型中触发saving事件方法,但它永远不会:

class User extends Authenticatable
{
    use HasImage;

    protected $guarded = [];

    public static function boot()
    {
        parent::boot();

        static::saving(function (User $user) {
            dd('user saving is never triggered');
        });
    }
}

是的,这正是我正在使用的代码。没有比这更基本的了。

如果我添加模型特征,它们也不会执行它们的启动事件,但仍会调用 bootHasImage:

trait HasImage
{
    protected static function bootHasImage()
    {
        dd('this will be hit on boot');

        static::saved(function (self $model) {
            dd('this is never hit on model save');
        });
    }
}

要使 saved 事件起作用,我还必须将其直接移动到 UserObserver。

这里会发生什么?

【问题讨论】:

  • 该方法可能在v7中有所改变,因为根据docs,该方法应该被称为booted。
  • 更改为booted 会在其中执行代码,但是,在模型保存或创建时仍然不会调用事件。
  • 我已经有几年没用过 Laravel 了。您是否需要扩展 Model 类才能使事件起作用?
  • Authenticatable (Illuminate\Foundation\Auth\User) 扩展 Model
  • 我可以让模型事件工作的唯一方法是将它们绑定到一个单独的观察者类中(例如UserObserver)。但是,模型特征的引导方法仍然不起作用。例如,如果我在User 模型上有特征HasImage,那么bootHasImage() 静态方法永远不会在启动时被调用。这在 Laravel 的早期版本中总是有效的,并且查看 Laravel 使用的引导代码表明它仍然应该在 v7.0 中。我对这里发生的事情感到恼火。

标签: php laravel laravel-7


【解决方案1】:

如果您想使用批量可分配属性,请记住在您的用户模型上设置 $fillable 选项。

 protected $fillable = [
        'email'       
    ];

【讨论】:

  • $guarded = [] 负责这个。
猜你喜欢
  • 2017-05-08
  • 2021-09-19
  • 1970-01-01
  • 2016-09-11
  • 2014-08-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
相关资源
最近更新 更多