Laravel 政策:忽略代码更改。是否有任何策略缓存要清除?

Laravel policies : code change is ignored. Is there any policy cache to clear?

我在一份申请上全职工作了 2 年。我经常遇到这个错误,比如说每隔几个月,但从来没有设法以可靠的方式修复它,因为它就消失了,我再也找不到 "why"。

所以,它又出现了,我不知道为什么以及如何修复它。这一次,我正在写一些东西,这样我下次就会有一个收藏夹。

这是错误:
如果我对策略方法进行任何更改,例如在 app/Policies/UserPolicy 中,在 blade 中使用 @can 或在 php 中使用 $user->can 时不会考虑更改文件。我可以在策略中引入 die,在函数的最开始引入 Log::debug('something') 甚至 return false,但不,仍然 return 是真的。

这是一个代码示例:
文件:app/Policies/UserPolicy

public function deleteUser(User $user, User $target)
{
    return false;
    if ($user->id === $target->id) {
        return false;
    }
// [...]
}

这是代码测试,它return是真的,无论我在策略代码中做什么:

$me = Auth::user();
dd($me->can('deleteUser', $me));

本来这个例子应该 return 错误,但它是 return 正确的,我不知道为什么。修改代码并没有改变任何东西,就像有一个缓存什么都无法清除。我已经尝试了所有我知道的缓存清除命令:

甚至重新启动了 apache,等等...我检查了 php.ini,我没有启用 OPCache(注释行,但我也尝试过 OPcache.enabled=0,没有变化) .

也许原因在别处,但我不知道去哪里找。正如我所说,这个错误通常会自行消失,而不会给我留下查找原因的时间。

重现错误的其他方法
在 blade 中,如果我写:

@can('deleteUser', $user)
  CAN
@endcan

一直显示CAN。例如,如果我将策略文件中的函数重命名为 deleteUserr,则没有任何变化(仍然 returns 为真)。但是,如果我将 blade 代码更改为 @can('deleteUserr', $user),那么我不会显示 "CAN",因为未找到此函数并且未找到规则的结果始终为 false。

环境
WSL(Ubuntu 18.04,apache 2.4.29,php 7.2.19),Laravel 6.0.3

感谢您的帮助!



编辑/解决:找到罪魁祸首!

与 composer 包的交互很糟糕 spatie/laravel-permission
我有一个名为 "deleteUser" 的 spatie 权限并被授予。该包可能已经重载了“->can”方法,现在在继续执行策略路由之前首先检查其权限机制。所以我的 UserPolicy@deleteUser 被忽略了。

这是我找到的原因:

与 composer 包的交互很糟糕 spatie/laravel-permission。

我有一个名为 "deleteUser" 的 spatie 权限并被授予。该包可能已经重载了“->can”方法,现在在继续执行策略路由之前首先检查其权限机制。
由于授予 "deleteUser" 权限,UserPolicy@deleteUser 将被忽略。