CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Erreur PHP avec bundle EasyAdmin

ScientistLambda
ScientistLambda
Niveau 10
08 mai 2020 à 18:41:41

Bonjour,

j'ai intégré le bundle easy Admin sous Symfony

https://symfony.com/doc/master/bundles/EasyAdminBundle/index.html

Il fonctionne, le soucis est que j'aimerais que les seules qui aient accès à cette interface soit les utilisateurs qui ont un rôle admin déclaré donc j'ai ajouté ça a mon security.yaml
- { path: ^/admin, roles: ROLE_ADMIN }

Dans mon entité utilisateur voila ce que j'ai


    public function getRoles(): array
    {
        $roles = $this->roles;
        // guarantee every user at least has ROLE_USER
        $roles[] = 'ROLE_USER';

        return array_unique($roles);
    }

Il retourne les rôles dans un array ce qui me vaut l'erreur

Object of class App\Entity\User could not be converted to string

EasyAdmin n'accepte pas mon rôle déclaré en array donc j'essaye d'inclure la fonction __toString()

  public function __toString()
    {
        
        return $this->roles;
    }
    

Et je me tapes l'erreur

Method App\Entity\User::__toString() must return a string value

Je ne comprends pas ou ça coince la seule variable en array étant le $roles, même avec la fonction toString() ça ne marche pas :(

J'ai aussi remarqué que l'utilisateur créé avait toujours comme propriété ce qui me semble être un array dans la console symfony

https://image.noelshack.com/fichiers/2020/19/5/1588955997-111.png

Sachant que avoir une double propriété est inévitable vu que ROLE_USER est défini dès la création d'un compte :(

Merci pour ceux qui ont lu, j'ai bien essayé de poser la question sur OpenClassrooms mais personne ne m'a répondu :hap:

VinkingBanni
VinkingBanni
Niveau 10
08 mai 2020 à 20:13:11

tu as un array, c'est un array

une chaine est aussi un array mais particulier

Mais ton array roles n'est pas considérer comme une chaine.

Visiblement tu te lance sans avoir les bases

ScientistLambda
ScientistLambda
Niveau 10
08 mai 2020 à 21:39:14

De ce que j'ai compris un array est un tableau, il sert à associer plusieurs valeurs

J'ai besoin d'une chaîne pour authentifier sous Easy Admin

La fonction __toString() me permet de récupérer la variable de ma valeur roles qui est au format tableau puis de la mettre au format chaine de caractères pour permettre son utilisation sous Easy Admin

Donc effectivement à partir de ce que je sais, je ne sais pas où ça coince car tout semble concorder :(

J'ai essayé de faire le contraire c'est à dire de mettre ma variable roles en chaîne plutôt qu'en tableau

ça marche correctement avec Easy Admin, mais le soucis c'est que tout le reste de mon site récupère la variable en array et ne fonctionne plus donc je ne peut pas me permettre de laisser la variable $roles en chaîne de caractère :(

ScientistLambda
ScientistLambda
Niveau 10
08 mai 2020 à 21:54:52

Je me suis relu et c'est vrai que je me suis mal exprimé

Je sais que mon array roles n'est pas considéré comme une chaine

Sous symfony j'ai une fonction qui transforme les variables de type array en donnant une chaîne à la sortie

C'est la fameuse fonction __toString() or ça ne fonctionne pas dans mon cas car j'ai dût faire une erreur quelque part

Comme je l'ai dit si je transforme ma variable roles en chaine dans ma BDD ça fonctionne, mais le reste de mon site identifie roles sous un array :(

Message édité le 08 mai 2020 à 21:55:14 par ScientistLambda
VinkingBanni
VinkingBanni
Niveau 10
09 mai 2020 à 09:34:54

C'est pas magique, c'est les bases

Si tu comprends pas ça et que tu utilise déjà Symfony ça va être coton !

ta fonction je le répété renvoie un array pas une chaîne !

ta fonction to string ne fais rien de plus que ton getRoles()

ScientistLambda
ScientistLambda
Niveau 10
09 mai 2020 à 14:03:02

Je pensais que c'était une méthode qui appelait d'autres fichiers car sur les forums anglophones ils réglaient leur soucis en ajoutant la fonction __toString() comme je l'ai mise en haut.

Bon j'ai compris que c'était pas magique donc j'ai cherché sur la docu PHP et j'ai trouvé la bonne fonction que j'ai mise dans mon code

 public function __toString()
    {
        implode ( $roles );
    }
   

La fonction implode transforme mon array en string, j'ai bien mon ROLE_ADMIN authentifié sur l'espace Easy Admin

Pas de soucis sur le reste du site

Par contre il va falloir que j'implémente une fonction similaire à mes entités si je veut pouvoir les éditer dans Easy Admin

VinkingBanni
VinkingBanni
Niveau 10
09 mai 2020 à 18:57:36

un petit coup de pousse
return json_encode($monArraydeData);

sous symfony tu as même un sérialiser pour ça !

ScientistLambda
ScientistLambda
Niveau 10
09 mai 2020 à 19:21:51

Merci, j'ai encore beaucoup de choses à apprendre

fanof_banni
fanof_banni
Niveau 12
09 mai 2020 à 19:33:50

Si à la base t'as l'erreur Object of class App\Entity\User could not be converted to string c'est qu'easyAdmin essaye d'afficher un objet User.
Sauf que de base tu ne peux pas faire un echo $object;.
Pour palier à ça on peut implémenter la fonction toString(), le principe de cette fonction est qu'elle doit toujours retourner une chaîne de caractère (qui va "représenter" l'objet).
Ensuite quand tu feras un echo de ton objet, c'est la valeur de toString() qui sera affichée et tu n'auras plus d'erreur.
Du coup dans ta classe User tu devrais plutôt faire en sorte que toString() retourne quelque chose comme les nom et prénom de l'utilisateur.

ScientistLambda
ScientistLambda
Niveau 10
09 mai 2020 à 20:17:41

Le but est d'afficher toutes les variables d'une entité dans le but de les éditer/supprimer

De ce fait je dois tout inclure mais à la prochaine bdd je ferais gaffe à ce que cela soit bien compatible

VinkingBanni
VinkingBanni
Niveau 10
09 mai 2020 à 20:43:18

Le 09 mai 2020 à 19:33:50 fanof_banni a écrit :
Si à la base t'as l'erreur Object of class App\Entity\User could not be converted to string c'est qu'easyAdmin essaye d'afficher un objet User.
Sauf que de base tu ne peux pas faire un echo $object;.
Pour palier à ça on peut implémenter la fonction toString(), le principe de cette fonction est qu'elle doit toujours retourner une chaîne de caractère (qui va "représenter" l'objet).
Ensuite quand tu feras un echo de ton objet, c'est la valeur de toString() qui sera affichée et tu n'auras plus d'erreur.
Du coup dans ta classe User tu devrais plutôt faire en sorte que toString() retourne quelque chose comme les nom et prénom de l'utilisateur.

je suis pas sur que ce soit le problème.
J'ai souvent constaté que ce genre de bundle c'étais un peux de la merde complexe pour pas grand chose apres avoir essayé API Platforme .

En plus ça demande une grosse connaissance du Famework et du fonctionnement du bundle .

Je connais pas le projet de l'auteur, mais il devrais abandonner sont projet symfony pour du full vanilla.
ou faire une bonne formation en algo, puiis PHP et Symfony

deepblue
deepblue
Niveau 16
09 mai 2020 à 20:53:05

Ton erreur n'a rien avoir avec ta problématique de rôles. Ta méthode `getRoles` me paraît correct bien que ça puisse être discuté.

`Object of class App\Entity\User could not be converted to string` indique l'utilisation d'une instance de `App\Entity\User` comme une chaîne de caractères pose souci. En effet, l'interpréteur ne sait pas comment rendre cette instance sur la forme d'une chaîne de caractères. En implémentant la méthode `__toString`, tu décides de la manière de rendre ton objet sous forme de chaîne de caractères.

Concrètement, tu dois définir ce que tu veux voir écrit si tu fais un `echo $user`. En général, on va imprimer le nom d'utilisateur et/ou l'email, voir sur identifiant.

Exemple :


public function __toString()
{
    return $this->id.' '.$this->username.' ('.$this->email.')';
}
ScientistLambda
ScientistLambda
Niveau 10
10 mai 2020 à 14:06:04

Le 09 mai 2020 à 20:53:05 deepblue a écrit :
Ton erreur n'a rien avoir avec ta problématique de rôles. Ta méthode `getRoles` me paraît correct bien que ça puisse être discuté.

`Object of class App\Entity\User could not be converted to string` indique l'utilisation d'une instance de `App\Entity\User` comme une chaîne de caractères pose souci. En effet, l'interpréteur ne sait pas comment rendre cette instance sur la forme d'une chaîne de caractères. En implémentant la méthode `__toString`, tu décides de la manière de rendre ton objet sous forme de chaîne de caractères.

Concrètement, tu dois définir ce que tu veux voir écrit si tu fais un `echo $user`. En général, on va imprimer le nom d'utilisateur et/ou l'email, voir sur identifiant.

Exemple :


public function __toString()
{
    return $this->id.' '.$this->username.' ('.$this->email.')';
}

Le soucis est que Easy Admin me prends toutes mes variables, même si je configure le fichier .yaml pour qu'il n'affiche qu'une seule variable, il va quand même sonder toute l'entité et s'arrêter dès la seule variable qui n'est pas une chaîne.

Pour les articles de mon site par exemple, la catégorie d'un article repose sur une variable $id de type integer, l'entité category est lié à l'entité article, si avec easy admin je veut gérer le contenu de mes articles je suis obligé de transformer la variable $id de mon entité category avec ça

   /**
 * Transform to string
 * 
 * @return string
 */
public function __toString()
{
    return (string) $this->getId();
}

Sinon je me retrouve avec une erreur Object of class App\Entity\Category could not be converted to string alors que j'essaye juste de modifier le $content de mon entité article

C'est peut être idiot de se lancer sur Symfony avec des lacunes en PHP mais je trouve que c'est très enrichissant

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de Jeux
  • Programmation
  • Création de sites web
  • Linux
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment