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 正确的,我不知道为什么。修改代码并没有改变任何东西,就像有一个缓存什么都无法清除。我已经尝试了所有我知道的缓存清除命令:
- php artisan cache:clear
- php artisan config:clear
- php artisan view:clear
- php artisan clear-compiled
- 作曲家dump-autoload
甚至重新启动了 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 将被忽略。
我在一份申请上全职工作了 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 正确的,我不知道为什么。修改代码并没有改变任何东西,就像有一个缓存什么都无法清除。我已经尝试了所有我知道的缓存清除命令:
- php artisan cache:clear
- php artisan config:clear
- php artisan view:clear
- php artisan clear-compiled
- 作曲家dump-autoload
甚至重新启动了 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 将被忽略。