Bonjour,

Voila je rencontre un petit problème avec mon code

Ce que je fais

Je cherche à supprimer un compte


    /**
     * @Route("/{id}/suppresionProfil", name="profil_suppression", methods={"DELETE"})
     */
    public function suppressionProfil(Request $request, User $user): Response
    {

        if ($this->isCsrfTokenValid('delete'.$user->getId(), $request->request->get('_token'))) {
            $entityManager = $this->getDoctrine()->getManager();
            $entityManager->remove($user);
            $entityManager->flush();

            $this->addFlash('sup', 'Votre compte a bien été supprimée');
        }

        return $this->redirectToRoute('accueil');
    }

Ce que j'obtiens

Je redirige bien l'utilisateur sur la page accueil et voilà l'erreur qui s'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.

Pourtant en bdd le compte a bien été supprimé, et si je réactualise la page, je suis bien sur l'accueil

Merci par avance,

10 réponses


aka-aka
Réponse acceptée

Salut,

J'etais dans le même cas que vous. En cherchant un peu j'ai fini par trouver la solution.
vous devez supprimer la session de l'utilisateur :

use Symfony\Component\HttpFoundation\Session\Session;

$session = new Session();
$session->invalidate();

Et pour que l'utilisateur ne se vois plus connecté on peux ajouter la redirection vers le logout

        return $this->redirectToRoute( 'security.logout' );

Bonjour, j'ai l'impression qu'il faut supprimer l'utilisateur en session...

J'ai eu le même problème.
Je l'ai solutionner en supprimant le user "manuellement" par l'administrateur.

Autrement j'ai créer une table "DemandeSuppressionUser" qui a une propriété qui est lié au User qui demande la suppression.

Maintenant s'il y'a une solution pour supprimer l'utilisateur de la session comme le recomande @dubitoph , moi je la veux bien !

bldlr
Auteur

Devdeb22, ça veut dire que tu fais travailler un admin ?

c'est une possibilité,
je comprends pourquoi j'ai l'erreur mais je n'ai trouvé aucune doc pour rectifier cela

J'ai même fais une fonction "fantôme" la suppression passe par cette fonction et est juste renvoyée sur la page accueil avec une redirect qui fait un peu une sorte de refresh, je l'avais utilisé pour un problème d'actualisation de notif.

Si je trouve je t'écris qq part

Oui effectivement, je fais travailler l'admin !

bldlr
Auteur

Salut Aka aka et merci pour ta réponse, j'avais laissé en stand by, je viens d'essayer et oui ça marche
merci beaucoup
par contre pourquoi redirectoRoute security.logout ?

Pour ma pars j'ai mis le nom d'utilisateur dans le menu et si je retourne pas sur le logout le nom reste jusqu'au prochain rafrechissement de page.

bldlr
Auteur

ah oui je vois, j'ai fais autrement. j'ai mis une condition entre app.user ou pas.
merci beaucoup

Si c'est la solution place le post en resolut ^^ ☺

Je reviens sur ce sujet : la réponse apportée par aka-aka est loin d'être "propre".
En effet, la création d'un nouvel objet Session contourne le problème et contourne la session déjà gérée par symfony.

Voici la solution que j'ai trouvée et qui permet, entre autre, d'ajouter des messages flash après avoir supprimer le compte utilisateur en injectant le container :

$user = $user->getUser();
$this->container->get('security.token_storage')->setToken(null);

$em->remove($user);
$em->flush();

// Ceci ne fonctionne pas avec la création d'une nouvelle session !
$this->addFlash('success', 'Votre compte utilisateur a bien été supprimé !'); 

return $this->redirectToRoute('home');