64. Cómo crear roles y permisos


4 comentarios

Inicia sesión para comentar

Comentarios:

  • Rodnal

    Rodnal hace 1 semana

    Si tienes este error:  Spatie\Permission\Exceptions\RoleDoesNotExist

     There is no role named `administrador` for guard `web`.

     at vendor\spatie\laravel-permission\src\Exceptions\RoleDoesNotExist.php:11
         7▕ class RoleDoesNotExist extends InvalidArgumentException
         8▕ {
         9▕     public static function named(string $roleName, ?string $guardName)
        10▕     {
     ➜  11▕         return new static("There is no role named `{$roleName}` for guard `{$guardName}`.");
        12▕     }
        13▕
        14▕     /**
        15▕      * @param  int|string  $roleId

     1   vendor\spatie\laravel-permission\src\Models\Role.php:105
         Spatie\Permission\Exceptions\RoleDoesNotExist::named("administrador", "web")

     2   vendor\spatie\laravel-permission\src\Traits\HasRoles.php:397
         Spatie\Permission\Models\Role::findByName("administrador", "web")
     

    Solucionalo con el orden de ejecucion de los seeders en DatabaseSeeder: 

        $this->call(RoleSeeder::class);

        $this->call(UserSeeder::class);

        Category::factory(5)->create();

        Tag::factory(20)->create();

        $this->call(PostSeeder::class);

  • Luiis Chogas

    Luiis Chogas hace 1 año

    Como le asigno cuando uso teams, no me funciona y me quede estancado

    User::create([ … ])->assignRole('Admin');
    • Emilio Rigoberto HernÁndez Lira hace 8 meses

      pudiste resolverlo?

  • Walter

    Walter hace 2 años

    ? Creación de Roles

     

    php artisan make:seeder RoleSeeder

     

    En database > seeders > RoleSeeder.php agregamos:

     

    use Spatie\Permission\Models\Role;
    
    class RoleSeeder extends Seeder
    {
    	public function run()
    	{
    		$role1 = Role::create(['name' => 'Admin']);
    		$role2 = Role::create(['name' => 'Blogger']);
    	}
    }

     

    ? Creación de Permisos

             Dentro de la función run anterior:

     

    	Permission::create(['name' => 'admin.home']);
    	
    	Permission::create(['name' => 'admin.categories.index']);
    	Permission::create(['name' => 'admin.categories.create']);
    	Permission::create(['name' => 'admin.categories.edit']);
    	Permission::create(['name' => 'admin.categories.destroy']);
    	
    	Permission::create(['name' => 'admin.tags.index']);
    	Permission::create(['name' => 'admin.tags.create']);
    	Permission::create(['name' => 'admin.tags.edit']);
    	Permission::create(['name' => 'admin.tags.destroy']);
    	
    	Permission::create(['name' => 'admin.posts.index']);
    	Permission::create(['name' => 'admin.posts.create']);
    	Permission::create(['name' => 'admin.posts.edit']);
    	Permission::create(['name' => 'admin.posts.destroy']);

     

             Ahora en la función run() de la clase DatabaseSeeder del archivo database > seeders > DatabaseSeeder.php agregamos:

     

    		$this->call(RoleSeeder::class);

     

             Ejecutamos los seeders:

     

    php artisan migrate:fresh --seed

     

    ? Asignamos permisos a los roles

             Introducimos registros en la tabla intermedia role_has_permissions usando el método syncRoles:

     

    Permission::create(['name' => 'admin.home'])->syncRoles([$role1, $role2]);

     

    ? Asignamos roles a usuarios

             En la función run() de la clase UserSeeder en el archivo database > seeders > UserSeeder.php usamos el método assignRole():

     

    	User::create([ … ])->assignRole('Admin');

     

             Volvemos a ejecutar los seeders:

     

    php artisan migrate:fresh --seed

     

  • Mauricio Giraldo

    Mauricio Giraldo hace 2 años

    Hola, me sale este error cuando agrego el  assignRole en el Seeder del User

      Class "App\Models\Role" not found

      751▕      * @return mixed
       752▕      */
       753▕     protected function newRelatedInstance($class)
       754▕     {
     ➜ 755▕         return tap(new $class, function ($instance) {
       756▕             if (! $instance->getConnectionName()) {
       757▕                 $instance->setConnection($this->connection);
       758▕             }
       759▕         });

     1   C:\wamp\www\Laravel9\Laravel\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Concerns\HasRelationships.php:490
         Illuminate\Database\Eloquent\Model::newRelatedInstance()

     2   C:\wamp\www\Laravel 9\\app\Models\User.php:78
         Illuminate\Database\Eloquent\Model::belongsToMany()
     

    • Victor Arana Flores hace 2 años

      Hola, el error te dice que no existe el modelo App\Models\Role

       

      Asegurate de seguir todos los pasos, ya que no debería estar llamando ese modelo, y debería estar llamado el modelo generado por Spatie.