Laravel 8: проблема с созданием и использованием нового разрешения

#laravel #laravel-permission

#laravel #laravel-разрешение

Вопрос:

У меня есть проект Laravel 8 на моем локальном ПК с Windows. Я загрузил проект на свой общий веб-хостинг на Dreamhost через zip-файл и скопировал всю базу данных на удаленный хост. (Я не могу использовать команды Composer и php artisan на удаленном сервере) Я использую отдельные роли и разрешения в своем проекте.

Позже мне пришлось добавить новое разрешение ‘holiday_vacation’ в мой проект. Я создал новое разрешение с помощью команд artisan в своей локальной системе. Я считаю, что когда создается новое разрешение, оно добавляет новую запись в permissions таблицу, а когда пользователю предоставляется доступ к определенному разрешению, запись добавляется в model_has_permissions таблицу. Я считаю, что никакая другая таблица не изменяется во время этого процесса. Недавно созданное разрешение ‘holiday_vacation’ отлично работает в моей локальной системе.

Однако после того, как я вручную обновил удаленные таблицы (разрешения и model_has_permissions), удаленная система не может найти новое разрешение (holiday_vacation). Следующие команды в контроллере отображают сообщение об ошибке: «Нет разрешения с именем holiday_vacation для guard web » .

 if(auth()->user()->hasPermissionTo('holiday_vacation') )
{
    dd("Has access");
}
 

Я абсолютно уверен, что таблица разрешений имеет holiday_vacation разрешение, поскольку я скопировал таблицы permissions и model_has_permissions из локальной базы данных в удаленную.

Поиск Google по этой проблеме говорит об очистке кэша разрешений (например, php artisan cache: забудьте spatie.permission.cache, затем php artisan cache: очистить). К сожалению, я не могу выполнять команды php artisan на моем общем хостинге.

Может кто-нибудь предложить обходной путь, пожалуйста?

Комментарии:

1. Какой драйвер кэша вы используете? (Кроме того, пора отказаться от общего хостинга.)

2. Вы можете попробовать удалить кеш, выполнив app()[SpatiePermissionPermissionRegistrar::class]->forgetCachedPermissions(); .

Ответ №1:

комментарий @BABAK ASHRAFI сделал свое дело, за исключением того, что команду нужно было немного изменить. (Ссылка: https://spatie.be/docs/laravel-permission/v3/advanced-usage/cache )

 app()->make(SpatiePermissionPermissionRegistrar::class)->forgetCachedPermissions();
 

Комментарии:

1. если это решило вашу проблему, отметьте ее как принятый ответ

2. К вашему сведению: если класс связан контейнером, то решение @babak-ashrafi также должно работать.