Problème sérialisation

Ce sujet est résolu
Default
,

Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

Je cherche a encoder une entité User en Json mais quand je demande au serializer de le normalizer j'ai une erreur.
Voici mon entité User :

<?php

namespace App\Entity;

use DateTime;
use Doctrine\ORM\Mapping as ORM;
use App\Repository\UserRepository;
use Doctrine\Common\Collections\Collection;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Serializer\Annotation\Groups;

/**
 * @ORM\Entity(repositoryClass=UserRepository::class)
 */
class User
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     * @Groups("user:read")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     * @Groups("user:read")
     */
    private $prenom;

    /**
     * @ORM\Column(type="string", length=255)
     * @Groups("user:read")
     */
    private $nom;

    /**
     * @ORM\Column(type="string", length=255)
     * @Groups("user:read")
     */
    private $mail;

    /**
     * @ORM\Column(type="string", length=255)
     * @Groups("user:read")
     */
    private $hashmdp;

    /**
     * @ORM\Column(type="boolean")
     * @Groups("user:read")
     */
    private $actif = true;

    /**
     * @ORM\Column(type="boolean")
     * @Groups("user:read")
     */
    private $abonnement = true;

    /**
     * @ORM\Column(type="string", length=255)
     * @Groups("user:read")
     */
    private $tel;

    /**
     * @ORM\Column(type="string", length=255)
     * @Groups("user:read")
     */
    private $image;

    /**
     * @ORM\Column(type="datetime")
     * @Groups("user:read")
     */
    private $date_inscription;

    /**
     * @ORM\OneToMany(targetEntity=News::class, mappedBy="user")
     */
    private $listNews;

    /**
     * @ORM\ManyToOne(targetEntity=Role::class, inversedBy="user")
     * @ORM\JoinColumn(nullable=false)
     */
    private $role;

    public function __construct()
    {
        $this->listNews = new ArrayCollection();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getPrenom(): ?string
    {
        return $this->prenom;
    }

    public function setPrenom(string $prenom): self
    {
        $this->prenom = $prenom;

        return $this;
    }

    public function getNom(): ?string
    {
        return $this->nom;
    }

    public function setNom(string $nom): self
    {
        $this->nom = $nom;

        return $this;
    }

    public function getMail(): ?string
    {
        return $this->mail;
    }

    public function setMail(string $mail): self
    {
        $this->mail = $mail;

        return $this;
    }

    public function getHashmdp(): ?string
    {
        return $this->hashmdp;
    }

    public function setHashmdp(string $hashmdp): self
    {
        $this->hashmdp = $hashmdp;

        return $this;
    }

    public function getActif(): ?bool
    {
        return $this->actif;
    }

    public function setActif(bool $actif): self
    {
        $this->actif = $actif;

        return $this;
    }

    public function getAbonnement(): ?bool
    {
        return $this->abonnement;
    }

    public function setAbonnement(bool $abonnement): self
    {
        $this->abonnement = $abonnement;

        return $this;
    }

    public function getTel(): ?string
    {
        return $this->tel;
    }

    public function setTel(string $tel): self
    {
        $this->tel = $tel;

        return $this;
    }

    public function getImage(): ?string
    {
        return $this->image;
    }

    public function setImage(string $image): self
    {
        $this->image = $image;

        return $this;
    }

    public function getDateInscription(): ?\DateTimeInterface
    {
        return $this->date_inscription;
    }

    public function setDateInscription(\DateTimeInterface $date_inscription): self
    {
        $this->date_inscription = $date_inscription;

        return $this;
    }

    /**
     * @return Collection|News[]
     */
    public function getListNews(): Collection
    {
        return $this->listNews;
    }

    public function addNews(News $news): self
    {
        if (!$this->listNews->contains($news)) {
            $this->listNews[] = $news;
            $news->setUser($this);
        }

        return $this;
    }

    public function removeNews(News $news): self
    {
        if ($this->listNews->contains($news)) {
            $this->listNews->removeElement($news);
            // set the owning side to null (unless already changed)
            if ($news->getUser() === $this) {
                $news->setUser(null);
            }
        }

        return $this;
    }

    public function getRole(): ?Role
    {
        return $this->role;
    }

    public function setRole(?Role $role): self
    {
        $this->role = $role;

        return $this;
    }

    public function addListNews(News $listNews): self
    {
        if (!$this->listNews->contains($listNews)) {
            $this->listNews[] = $listNews;
            $listNews->setUser($this);
        }

        return $this;
    }

    public function removeListNews(News $listNews): self
    {
        if ($this->listNews->contains($listNews)) {
            $this->listNews->removeElement($listNews);
            // set the owning side to null (unless already changed)
            if ($listNews->getUser() === $this) {
                $listNews->setUser(null);
            }
        }

        return $this;
    }
}

Et voici mon controler :


namespace App\Controller;

use App\Repository\UserRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Serializer\SerializerInterface;

class UserController extends AbstractController
{
    /**
     * @Route("/users", name="users")
     */
    public function index(UserRepository $userRepository, SerializerInterface $serializerInterface)
    {
        $users = $userRepository->findAll();

        $json = $serializerInterface->serialize($users, 'json', ['groups' => 'user:read']);

        dd($json);

        return new JsonResponse($json, 200, [], true);
    }
}

Ce que je veux

Je cherche a obtenir tous les champ qui on le tag @Groups("user:read") sous format json.
Apres m'ettre renseigner un peut j'ai peut etre une piste avec la création d'un normalizer custom meme si je comprend pas pourquoi je devrais en faire un, je pensez que le serialiser le fearais tous seul.

Ce que j'obtiens

Sur une requette get sur l'adresse http://127.0.0.1:8000/users j'ai comme erreur Could not normalize object of type "App\Entity\User", no supporting normalizer found.

Voila si quelqu'un pourrais m'aidez (rapidement si possible :) ) ça serais sympatique

Cordialement
Dénez Fauchon

2 Réponse

Default
,

Bonjour, GregoirBoc,
Merci de m'avoir repondu. Pour ce qui est de la serialisation dans symfony c'est le fait de passer d'un objet PHP à un format json, passer d'un array au forma json c'est ca la Normalization voici une peuttite photo explicative : https://www.novaway.fr/uploads/media/serializer_workflow.png
Pour ce qui est de mon problème il s'est resolut de lui meme, je n'ai pas trouver le problème, tous est identique et marche.

224056
,

Bonjour,
Symfony arrive avec plusieurs Normalizer déjà faits (https://symfony.com/doc/current/serializer/normalizers.html) Mais pour un objet aussi spécifique il semble en effet qu'il faille construire un custom Normalizer (https://symfony.com/doc/current/serializer/custom_normalizer.html). Si j'ai bien compris, le serializer permet de transformer un array en un certain format (ici json) mais on a aussi besoin d'un normalizer qui va transformer un objet (ici user) en array.
Cordialement,
Greg