Политики Laravel: изменение кода игнорируется. Есть ли кеш политики для очистки? - PullRequest
0 голосов
/ 15 октября 2019

Я работаю над заявкой в ​​течение 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 просто игнорируется.

1 Ответ

0 голосов
/ 17 октября 2019

Вот причина, которую я нашел:

Это плохое взаимодействие с пакетом composer spatie / laravel-Разрешение.

У меня есть разрешение на доступ к пространству, которое называется "deleteUser" и предоставлено. Пакет, вероятно, перегружен методом "-> can" и теперь проверяет сначала в своем механизме разрешений, прежде чем идти по маршруту политики.
Поскольку разрешение "deleteUser" предоставлено, UserPolicy @ deleteUser просто игнорируется.

...