Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SF4] Supprimer son compte utilisateur et erreur

    22 mars 2019 à 14:12:45

    Bonjour,


    Je suis en train de faire un espace membre et dedans je souhaite donner la possibilité à l'utilisateur de supprimer son compte.

    Lors du clique de l'utilisateur sur le bouton supprimer, il m'affiche "You cannot refresh a user from the EntityUserProvider that does not contain an identifier. The user object has to be serialized with its own identifier mapped by Doctrine.". Dans mon entité l'id est bien serializé

    Au niveau de ma bdd l'utilisateur est bien supprimé ; d'ailleurs il retourne sur la page d'accueil le message flash est affiché.

    En soit voici le code :

    Controller

    <?php
    
         /**
         * @param UserService $userService
         * @param $id
         * @Route("/profil/delete/{id}", name="delete_account", requirements={"id"="\d+"})
         * @Security("has_role('ROLE_USER')")
         * @return \Symfony\Component\HttpFoundation\RedirectResponse
         */
        public function index(UserService $userService, $id)
        {
            $id_user = $userService->idUser($id);
    
            $userService->removeUser($id_user);
    
            $this->addFlash('notice', 'Compte supprimé');
    
            return $this->redirectToRoute('home');
        }

    La méthode de mon service utilisateur userService.php

    <?php
    
         /**
         * @param $id
         * Remove User
         */
        public function removeUser($id)
        {
            $this->doctrine->remove($id);
            $this->doctrine->flush();
        }
    <?php     
         /**
         * @param $id
         * @return mixed
         */
        public function idUser($id)
        {
            $user = $this->doctrine->getRepository(User::class)->find($id);
    
            return $user;
        }



    Et l'entité User

    <?php
    
    namespace App\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    use Symfony\Component\Security\Core\User\UserInterface;
    use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
    use Symfony\Component\Validator\Constraints as Assert;
    
    /**
     * Class User
     * @package App\Entity
     * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
     * @ORM\Table(name="user")
     * @UniqueEntity(fields="email", message="Email already taken")
     * @UniqueEntity(fields="username", message="Username already taken")
     */
    class User implements UserInterface, \Serializable
    {
        /**
         * @var int
         *
         * @ORM\Id
         * @ORM\GeneratedValue
         * @ORM\Column(type="integer")
         */
        private $id;
    
        /**
         * @var string
         *
         * @ORM\Column(type="string", unique=true)
         */
        private $username;
    
        /**
         * @var string
         *
         * @ORM\Column(type="string", unique=true)
         * @Assert\Email()
         */
        private $email;
    
        /**
         * @var string
         *
         * @ORM\Column(type="string", length=64)
         */
        private $password;
    
        /**
         * @var array
         *
         * @ORM\Column(type="json")
         */
        private $roles = [];
    
        /**
         * @var string
         *
         * @ORM\Column(type="string", length=255)
         */
        private $token;
    
        /**
         * @ORM\Column(name="is_active", type="boolean")
         */
        private $isActive;
    
        /**
         * @ORM\Column(name="is_banned", type="boolean")
         */
        private $isBanned;
    
        /**
         * @var \DateTime
         * @ORM\Column(name="date_created", type="datetime", nullable=true)
         */
        private $date_created;
    
        /**
         * User constructor.
         */
        public function __construct()
        {
            $this->date_created = new \DateTime('now');
            $this->isActive = false;
            $this->isBanned = false;
        }
    
        public function getId(): int
        {
            return $this->id;
        }
    
        public function getUsername(): ?string
        {
            return $this->username;
        }
    
        public function setUsername(string $username): void
        {
            $this->username = $username;
        }
    
        public function getEmail(): ?string
        {
            return $this->email;
        }
    
        public function setEmail(string $email): void
        {
            $this->email = $email;
        }
    
        public function getPassword(): ?string
        {
            return $this->password;
        }
    
        public function setPassword(string $password): void
        {
            $this->password = $password;
        }
    
        /**
         * @return string
         */
        public function getToken(): string
        {
            return $this->token;
        }
    
        /**
         * @param string $token
         */
        public function setToken(string $token): void
        {
            $this->token = $token;
        }
    
        /*
           * Get isActive
           */
        public function getIsActive()
        {
            return $this->isActive;
        }
    
        /*
         * Set isActive
         */
        public function setIsActive($isActive)
        {
            $this->isActive = $isActive;
            return $this;
        }
    
        /**
         * @return mixed
         */
        public function getIsBanned()
        {
            return $this->isBanned;
        }
    
        /**
         * @param $isBanned
         * @return $this
         */
        public function setIsBanned($isBanned)
        {
            $this->isBanned = $isBanned;
            return $this;
        }
    
        /**
         * @return \DateTime
         */
        public function getDateCreated(): \DateTime
        {
            return $this->date_created;
        }
    
        /**
         * @param \DateTime $date_created
         */
        public function setDateCreated(\DateTime $date_created): void
        {
            $this->date_created = $date_created;
        }
    
        /**
         * Retourne les rôles de l'user
         */
        public function getRoles(): array
        {
            $roles = $this->roles;
    
            if (empty($roles)) {
                $roles[] = 'ROLE_USER';
            }
    
            return array_unique($roles);
        }
    
        public function setRoles(array $roles): void
        {
            $this->roles = $roles;
        }
    
        /**
         * Retour le salt qui a servi à coder le mot de passe
         *
         * {@inheritdoc}
         */
        public function getSalt(): ?string
        {
    
            return null;
        }
    
        /**
         * Removes sensitive data from the user.
         *
         * {@inheritdoc}
         */
        public function eraseCredentials(): void
        {
        }
    
        /**
         * {@inheritdoc}
         */
        public function serialize(): string
        {
            return serialize([
                $this->id,
                $this->username,
                $this->password,
                $this->isActive,
                $this->isBanned
            ]);
        }
    
        /**
         * {@inheritdoc}
         */
        public function unserialize($serialized): void
        {
            list (
                $this->id,
                $this->username,
                $this->password,
                $this->isActive,
                $this->isBanned,
                ) = unserialize($serialized);
        }
    }

    Si vous avez une idée du problème je suis preneur !

    Merci d'avance pour vos lumières




    -
    Edité par Sony2K 22 mars 2019 à 14:15:02

    • Partager sur Facebook
    • Partager sur Twitter
      22 mars 2019 à 16:22:18

      Bonjour,

      Pourquoi passer par un remove via l'id et pas remove de l'objet user récupéré par l'id ?

      Je pense que cela peut poser problème de supprimer l'user suivant le champs de ton appli. Si par exemple il y a des liens avec le user tu supprimes tous les liens et les objets en relation ? 

      Pour ma part je ferai plutôt une propriété de désactivation de compte.

      A+

      • Partager sur Facebook
      • Partager sur Twitter
        23 mars 2019 à 8:31:56

        Bonjour monkey3d et merci pour ta réponse.

        Que veux tu dire par supprimer l'obj ? Je n'ai pas encore fait cette pratique en PHP/SF si tu sais m'en dire plus je ne dis pas non !

        Pour le fait de désactiver le compte il y auras là possibilité, mais au niveau RGPD je dois donner la possibilité à l'utilisateur de supprimer son compte. Du coup pour en revenir à ton concept de supprimer l'obj serait plus qu’approprié vu que je dois pouvoir supprimer certaines données en cascade.

        PS: Après d'autres recherches, j'ai essayé de vider la session au moment de la suppression de l'utilisateur, du coup cela fonctionne (par contre je n'ai plus le message flash pour prévenir que l'utilisateur à bien supprimé son compte vais devoir trouver une parade :D )

        -
        Edité par Sony2K 23 mars 2019 à 9:28:52

        • Partager sur Facebook
        • Partager sur Twitter
          23 mars 2019 à 13:00:26

          Salut 

          Pourrait-on avoir tout le code complet de ton Controller/UserService

          Merci d'avance

          • Partager sur Facebook
          • Partager sur Twitter

          [SF4] Supprimer son compte utilisateur et erreur

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown