Laravel策略:代码更改被忽略。有需要清除的策略缓存吗?

时间:2019-10-15 16:13:29

标签: laravel laravel-6

我正在全职工作两年。我经常每隔几个月遇到一次该错误,但是从来没有以一种可靠的方式来解决它,因为它只是消失了,我也永远找不到“为什么”。

那么,又来了,我不知道为什么以及如何解决它。这次,我正在写一些东西,以便下次有一个我喜欢的页面。

这是错误
如果我对策略方法进行了任何更改(例如在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,但我不知道为什么。修改代码不会改变任何事情,就像有一个无法清除的缓存。我已经尝试了所有我知道的缓存清除命令:

  • php artisan cache:clear
  • php artisan config:clear
  • php artisan view:clear
  • php artisan明确编译
  • composer dump-autoload

即使重新启动了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仅被忽略。

1 个答案:

答案 0 :(得分:0)

这是我发现的原因:

与作曲家包spatie / laravel-permission的交互不良。

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

相关问题