Нет роли с именем `admin`. ларавел

Я использую этот пакет:

https://github.com/spatie/laravel-permission/tree/v2

код:

     $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']);
Другие вопросы по тегам