Bonjour les gens,

je cherche désespérément de l'aide. Je veux faire des roles qui sont sauvegarder en base de donné mais je ne trouve aucune aide sur ce sujet.

J'utilise symfony 6.1 et Api Platform 3.0.

ce que j'ai compris c'est :

  • getRoles doit retourner un tableau de string
  • qu'un role doit commencer par ROLE_

Mais par defaut getRoles reprend les roles sous forme d'objet. J'ai donc fait ca :

public function getRoles(): array
    {
        return array_map(function(Role $role){return $role->getRole();}, $this->roles->toArray());
    }

ce qui me donne ca :

array [
  0 => "ROLE_ADMINISTRATOR"
  1 => "ROLE_DEBUG"
]

On est bon pour le getRoles(); !

Mais le soucis c'est quand je sauvegarde l'utilisateur cela provoque une erreur car il faut un tableau d'objet Role.

ApiPlatform\Doctrine\EventListener\PurgeHttpCacheListener::getObjectClass(): Argument #1 ($object) must be of type object, string given, called in /var/www/vendor/api-platform/core/src/Doctrine/EventListener/PurgeHttpCacheListener.php

Ma question est comment convertir le tableau de strings sous forme de tableau d'objet Role avant et à chaque fois de sauvegarder l'utilisateur ?

Merci beaucoup.

7 réponses


larevuegeek
Réponse acceptée

Hello,

Je vais essayer de t'aider pour mon premier post sur le forum :).

J'ai été confronté à ce problème lors du passage de symfony 3 ou 4, j'avoue que ça date je ne me souvient plus exaxtement.

J'ai créé une nouvelle variable $dbRoles (celle qui est en réalité stockée en base de données) qui est un tableau d'objet de ma class ROLE.

Ensuite j'ai modifié les methodes comme cela, l'idée en gros c'est d'alimenter dynamiquement notre tableau de rôle avec les roles en base.

    public function getRoles(): array
    {   
        $r = [];
        foreach($this->dbRoles as $role) {
            if($role instanceof Role) {
                $r[] = $role->getRole();
            }
        }

        return $r;
    }

    public function hasRole(\App\Entity\Local\User\Role $role)
    {
        return $this->dbRoles->contains($role);
    }

Il y peut être d'autre façon de faire, mais de mon côté ça le fait plutôt bien :).

J'espère que ça va t'aider.

public function getRoles(): array
    {
        $roles = $this->roles;

        // Tu peux aussi ajouter un rôle à tous les utilisateurs par défaut qui n'est pas enregistré en base de donnée
        $roles[] = 'ROLE_USER';

        return array_unique($roles);
    }

Le probleme que j'ai est si le return de getRoles est toujours le tableau avec les strings, je ne peux plus sauvegarder mon utilisateur et si je garde le tableau de role j'ai une erreur quand je genere mon token jwt.

Bonjour Amstramgram,

Le problème ne vient pas de ta méthode "getRoles".
Faudrait revoir la configuration du composant ApiPlateform.
Vérifier surtout ce qui se passe au niveau du PurgeHttpCacheListener.

J'imagine que si le problème vient de ton token.
Montre nous la configuration et les fichiers relatifs à la connexion.
Je n'ai pas d'autre idée pour le moment.

D'où la technique que je t'ai précisé plus haut, il ne faut pas enregistrer $roles en database mais $dbRoles qui est ta propre variable de rôles.

Une fois sauvegardée en base, avec le bout de code que je t'ai montré plus haut, tu pourras récupérer dynamiquement tes rôles provenant de ta base de données et renvoyer un tableau de strings.

larevuegeek Je n'avais pa scompris comment faire. C'est bon effectivement en créant une propriété avec un autre nom de roles et en gardant le getRoles pour avoir le tableau des roles ca fonctione.

Merci.

De rien, Amstramgram, :).