我正在全职工作两年。我经常每隔几个月遇到一次该错误,但是从来没有以一种可靠的方式来解决它,因为它只是消失了,我也永远找不到“为什么”。
那么,又来了,我不知道为什么以及如何解决它。这次,我正在写一些东西,以便下次有一个我喜欢的页面。
这是错误:
如果我对策略方法进行了任何更改(例如在app / Policies / UserPolicy中),则在刀片中使用@can或在php文件中使用$ user-> can时,不会考虑更改。我可以在策略中引入die
,在函数开始时引入Log::debug('something')
甚至是return false
,但是不,仍然返回true。
这是一个代码示例:
文件:app / Policies / UserPolicy
public function deleteUser(User $user, User $target)
{
return false;
if ($user->id === $target->id) {
return false;
}
// [...]
}
这是代码测试,无论我在策略代码中做什么,它都会返回true:
$me = Auth::user();
dd($me->can('deleteUser', $me));
最初,此示例应返回false,但返回true,但我不知道为什么。修改代码不会改变任何事情,就像有一个无法清除的缓存。我已经尝试了所有我知道的缓存清除命令:
即使重新启动了Apache,依此类推...我检查了php.ini,我没有启用OPCache(行注释,但是我也尝试过OPcache.enabled = 0,没有任何变化)。
也许原因在别处,但我不知道在哪里看。就像我说的那样,这个错误通常会自行消失,而不会给我时间去寻找原因。
重现该错误的其他方式
在刀片中,如果我写:
@can('deleteUser', $user)
CAN
@endcan
它始终显示CAN。例如,如果我将策略文件中的函数重命名为deleteUserr,则没有任何变化(仍然返回true)。但是,如果我将刀片服务器代码更改为@can('deleteUserr', $user)
,则不会显示“ CAN”,因为找不到此功能并且未找到规则的结果始终为假。
环境
WSL(Ubuntu 18.04,Apache 2.4.29,PHP 7.2.19),Laravel 6.0.3
感谢您的帮助!
编辑/已解决:找到了罪魁祸首!
与作曲家软件包spatie/laravel-permission
的交互很糟糕。
我有一个spatie权限,名称为“ deleteUser”并被授予。该程序包可能已经重载了“-> can”方法,现在在进行策略路由之前先检查其权限机制。因此,我的UserPolicy @ deleteUser仅被忽略。
答案 0 :(得分:0)
这是我发现的原因:
与作曲家包spatie / laravel-permission的交互不良。
我有一个spatie权限,名称为“ deleteUser”并被授予。该程序包可能已经重载了“-> can”方法,现在在执行策略路由之前先检查其权限机制。
授予权限“ deleteUser”后,将忽略UserPolicy @ deleteUser。