Laravel 5中如何正确重载truncate方法避免递归调用?
解决模型truncate方法递归调用的问题
嘿,这个问题我见过好多次啦——你现在的代码之所以会触发递归,是因为你在自定义的truncate方法里调用了static::truncate(),这相当于让方法自己调用自己,无限循环下去了。
怎么改才对?
核心思路就是:你要调用的是父类(比如Laravel的Eloquent Model)原生的truncate方法,而不是你自己写的这个。所以把static::truncate()换成parent::truncate()就搞定了。
给你改好的示例代码:
public static function truncate() { // 先执行你的自定义代码逻辑 // 比如记录操作日志、清理关联的附属数据之类的 // 调用父类的原生截断方法,避免递归 parent::truncate(); }
为啥这样就能解决递归?
static::truncate()是“后期静态绑定”,会指向当前类(也就是你的MyModel)的truncate方法,所以调用它等于又跑回你自己写的这个方法里,自然就递归了parent::truncate()直接调用父类里实现的原生截断逻辑,完全绕过你自定义的方法,递归链就断了
额外小建议
如果你只是想在截断前后加一些操作,其实还有更优雅的方式——用模型的事件系统。比如在模型的boot方法里注册truncating或truncated事件:
protected static function boot() { parent::boot(); static::truncating(function () { // 这里写截断前要执行的逻辑 }); static::truncated(function () { // 这里写截断后要执行的逻辑 }); }
这样不用重写truncate方法,代码结构更清晰,也不容易踩递归的坑~
内容的提问来源于stack exchange,提问作者valera
相关产品推荐
相关产品推荐

