即使模型已(软)删除,Laravel仍触发已删除事件

即使模型已(软)删除,Laravel仍触发已删除事件,laravel,laravel-5,laravel-5.4,Laravel,Laravel 5,Laravel 5.4,当允许软删除的模型被删除时,我尝试执行一些额外的清理代码 我已钩住“已删除”事件以执行此清理代码,如下所示: protected static function boot() { parent::boot(); static::deleted( function ($mymodel) { <cleanup code here> } ); } 受保护的静态功能启动() { 父::boot(); static::deleted(函数($mymodel){}); }

当允许软删除的模型被删除时,我尝试执行一些额外的清理代码

我已钩住“已删除”事件以执行此清理代码,如下所示:

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

    static::deleted( function ($mymodel) { <cleanup code here> } );
}
受保护的静态功能启动()
{
父::boot();
static::deleted(函数($mymodel){});
}
但是我发现,如果对已删除的模型调用delete,则会再次触发delete事件。我希望框架中会有一个检查来防止这种情况,但它似乎不适合软删除模型

EDIT:我不太想讨论对软删除记录调用delete是否应该/不应该再次触发delete事件。我想会有各种各样的意见。事实上,它目前确实存在,而我的要求是它没有,所以这更多是这个问题的下一部分,关于我如何有力地实施检查,我需要一些帮助:


如果我必须实现我自己的检查,那么覆盖模型上的delete方法是否安全?或者是否有其他方法可以删除模型??我对这一点的担忧是,为什么我首先侦听已删除事件以运行清理代码,而不是重写delete方法并将清理代码放在对parent::delete()的调用之后,因为我认为无论如何启动模型的删除,都应该调用delete事件(如果确实有不止一种方法?。

在类中允许某个方法的责任取决于允许的触发器,因此不应该在视图中启用这种机制

记录的“已删除”状态本身定义代码/视图不会向“删除”消息公开对象,除非它在域中有另一个行为/规则允许这样做。是您定义对象域的规则,因此由您决定何时可以发生


例如,软删除可能允许第二次删除调用硬删除记录,因此FW不应限制该调用。

调用
delete()的原因是什么
首先在一个已经删除的模型上?是的,这是我在构建/调试前端时遇到的问题,所以我不同意应该在第一时间发生的事情。但是,我想我正在使用delete事件来代替我传统上可能通过数据库触发器完成的事情,所以我想要数据库和对象模型要坚固可靠,不易受到前端错误的攻击。我把它看作是一个属性设置器,传统上会在将值设置为X之前检查属性的值是否已经为X,并可能触发更改事件等。我知道你在做一般性的论证,在某些情况下我会同意,但是感觉在这种情况下有点牵强,因为软删除记录是一种定义良好的行为,事件触发表明记录已更改状态。如果它已处于删除状态,而您再次删除它,则由于第二次调用未更改记录的状态而触发另一个已删除事件似乎是错误的如果要硬删除记录,则存在ethod。此外,如果您多次删除不使用软删除的模型,则第二次调用不会触发事件。可以找到软删除的记录,这是受监视的行为,因为您可以通过调用该记录等方式来处理该记录。只要可以访问该记录,它将很容易发生错误接收消息。要点是“删除”是软删除记录的可接受消息,而硬删除记录不存在