Я работаю над заявкой в течение 2 лет. Я сталкиваюсь с этой ошибкой регулярно, скажем, каждые пару месяцев, но мне так и не удается надежно ее исправить, потому что она просто исчезает, и мне так и не удается найти «почему».
Итак, это снова, и я понятия не имею, почему и как это исправить. На этот раз я пишу что-то, поэтому в следующий раз у меня будет страница для избранных.
Вот ошибка :
Если я внесу какие-либо изменения в метод политики, например в app / Policies / UserPolicy, это изменение не будет учитываться при использовании @canв блейде или $ user-> can в php файле. Я могу ввести 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 clear-compiled
- 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
.
У меня есть разрешение на доступ к пространствуэто имя "deleteUser" и предоставляется. Пакет, вероятно, перегружен методом "-> can" и теперь проверяет сначала в своем механизме разрешений, прежде чем идти по маршруту политики. Так что мой UserPolicy @ deleteUser просто игнорируется.