Нет роли с именем `admin`. ларавел
Я использую этот пакет:
код:
$user=User::find(2);
$user->assignRole('admin');
и когда я назначаю пользователю роль администратора, я имею дело с этой ошибкой
Роль не названа
admin
.Spatie\Permission\Exceptions\RoleDoesNotExist
это мой охранник по умолчанию в auth.php:
<?php
return [
'defaults' => [
'guard' => 'api',
'passwords' => 'users',
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
'hash' => false,
],
],
это моя таблица ролей:
это моя таблица role_has_permission
и это моя таблица разрешений:
6 ответов
Просто добавьте это защищенное свойство в свою пользовательскую модель (или любую другую модель, которую вы используете для назначения разрешений и ролей).
protected $guard_name = 'api';
друзья! Я нашел решение этой проблемы, но прежде всего я покажу, почему эта проблема возникла. Как вы знаете, Laravel читает коды сверху вниз и слева направо. Более того, когда мы хотим из laravel обновить все данные по команде
php artisan migrate :fresh --seed
Он очищает все эти данные, и проблема начинается. Другими словами, когда команда назначает роль для проверки новой роли, происходит сбой, потому что все данные очищаются перед доступом к этим данным. Чтобы избежать этого, мы должны установить класс сеялки ролей перед классом сеялки администратора в сеялке базы данных.
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
$this->call([RoleSeeder::class, AdminSeeder::class]);
}
}
Добавьте это в свою модель пользователя
use Spatie\Permission\Traits\HasRoles;
и в классе модели пользователя
use HasRoles;
Вот ссылка
По соглашению лучше всего делать настраиваемые вещи в файле конфигурации.
Проблема с вашим кодом заключается в порядке расстановки охранников, просто измените порядок, как показано ниже.
<?php
return [
'defaults' => [
'guard' => 'api',
'passwords' => 'users',
],
'guards' => [
'api' => [
'driver' => 'token',
'provider' => 'users',
'hash' => false,
],
'web' => [
'driver' => 'session',
'provider' => 'users',
],
],
...
Как только это будет сделано, вам не нужно добавлять
protected $guard_name = 'api';
к вашей модели пользователя , убедитесь, что вы запустили
php artisan config:clear
Ссылка: Saptie Laravel Permisions
Добавьте в свой
User
модель:
public $guard_name = 'api';
Или:
public function guardName()
{
return 'api';
}
Это сработало для меня:
$role = Role::create(['guard_name' => 'admin', 'name' => 'manager']);