Symfony - Expected argument of type "DateTimeImmutable", "DateTime" given at property path "date".

Eléphant du PHP | 74 Messages

10 juil. 2023, 10:00

Bonjour,

Depuis deux jours, je suis confronté à un problème sur Symfony que je n'arrive pas à résoudre. Chaque fois que j'essaie d'ajouter une annonce après avoir rempli mon formulaire, une erreur se produit. J'aurais besoin de votre aide pour résoudre ce problème, s'il vous plaît...

L'erreur en question :

https://zupimages.net/up/23/28/y5ns.png

J'ai besoin de résoudre ce problème ! :cry: C'est important, c'est pour mes études...
J'ai Discord !

Voici mon CONTROLLER

<?php

namespace App\Controller;

use App\Entity\Evenement;
use App\Form\EvenementType;
use DateTimeImmutable;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;

class EventsController extends AbstractController
{
    /**
     *@Route("/events/new", name="events_new")
     */
    public function new(Request $request, ManagerRegistry $doctrine)
    {
        $evenement = new Evenement;

        $evenement->setPublishedAt(new DateTimeImmutable());

        $formEvenement = $this->createForm(EvenementType::class, $evenement);

        $formEvenement->handleRequest($request);

        if ($formEvenement->isSubmitted() && $formEvenement->isValid())
        {

        $entityManager = $doctrine->getManager();

        $entityManager->persist($evenement);

        $entityManager->flush();

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

    }

    return $this->render('events/form-new.html.twig', [
        "formEvenement" => $formEvenement->createView()
    ]);
    
    }


    /**
     * @Route ("/events/edit/{id}", name="evenement_edit")
     */
    public function edit($id, ManagerRegistry $doctrine, Request $request)
    {
        $evenement = $doctrine->getRepository(Evenement::class)->find($id);
        
        $formEvenement = $this->createForm(EvenementType::class, $evenement);
        $formEvenement->handleRequest($request);
        if($formEvenement->isSubmitted() && $formEvenement->isValid())

        {
            $entityManager = $doctrine->getManager();

            $entityManager->flush();
            
            return $this->redirectToRoute('evenement_list');
        }

        $formEvenement = $this->createForm(EvenementType::class, $evenement);

        return $this->render ('events/form-edit.html.twig', [
            "formEvenement" => $formEvenement->createView(),
        ]);

    }



    /**
     * @Route("/events/delete/{id}", name="evenement_delete")
     */
    public function delete($id, ManagerRegistry $doctrine)
    {
        
        $entityManager = $doctrine->getManager();

        $evenement = $doctrine->getRepository(Evenement::class)->find($id);
        
        $entityManager->remove($evenement);
        
        $entityManager->flush();
      
        return $this->redirectToRoute('evenement_list');

    }



    ##READ : ALL
    /**
     * @Route("/events/list", name="evenement_list")
     */
    public function readAll(ManagerRegistry $doctrine)
    {   
        $this->denyAccessUnlessGranted('ROLE_USER');
        #Etape 1 : Récupérer tous les livres
        $evenements = $doctrine->getRepository(Evenement::class)->findAll();

        #Envoyer les livres récupérés dans une page, dans laquelle vous listerez tous les livress
        return $this->render("events/list.html.twig", [
            "evenements" => $evenements
        ]);
    }



    /**
     * @Route("/events/{id}", name="evenement_detail", requirements={"id"="\d+"})
     */
    public function detail($id, ManagerRegistry $doctrine)
    {
        $evenements = $doctrine->getRepository(Evenement::class)->find($id);
        return $this->render('events/item.html.twig', [
            "evenements" => $evenements
        ]);
    }

    /**
     * @Route("/evenements", name="events") 
     */
    public function evenements(ManagerRegistry $doctrine)
    {
        $evenements = $doctrine->getRepository(Evenement::class)->findAll();
        return $this->render('events/evenements.html.twig', [
            "evenements" => $evenements
        ]);
    }
}

Voici mon ENTITY

<?php

namespace App\Entity;

use App\Repository\EvenementRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\HttpFoundation\File\File;
use Vich\UploaderBundle\Mapping\Annotation as Vich;
use Doctrine\DBAL\Types\Types;

#[ORM\Entity(repositoryClass: EvenementRepository::class)]
#[Vich\Uploadable]
class Evenement
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    private ?int $id = null;

    #[ORM\Column(length: 255, nullable: true)]
    private ?string $titre = null;

    #[ORM\OneToOne(inversedBy: 'evenement', cascade: ['persist', 'remove'])]
    #[ORM\JoinColumn(nullable: false)]
    private ?Artiste $nom = null;

    #[ORM\Column]
    private ?\DateTimeImmutable $date = null;

    #[ORM\Column(type: Types::TEXT, nullable: true)]
    private ?string $presentation = null;

    #[Vich\UploadableField(mapping: 'evenement', fileNameProperty: 'imageName')]
    private ?File $imageFile = null;

    #[ORM\Column(nullable: true)]
    private ?string $imageName = null;

    #[ORM\Column(nullable: true)]
    private ?\DateTimeImmutable $publishedAt = null;


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

    public function getTitre(): ?string
    {
        return $this->titre;
    }

    public function setTitre(?string $titre): self
    {
        $this->titre = $titre;

        return $this;
    }

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

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

        return $this;
    }

    public function getDate(): ?\DateTimeImmutable
    {
        return $this->date;
    }

    public function setDate(\DateTimeImmutable $date): self
    {
        $this->date = $date;

        return $this;
    }

    public function getPresentation(): ?string
    {
        return $this->presentation;
    }

    public function setPresentation(?string $presentation): self
    {
        $this->presentation = $presentation;

        return $this;
    }

    public function setImageFile(?File $imageFile = null): void
    {
        $this->imageFile = $imageFile;
        
    }

    public function getImageFile(): ?File
    {
        return $this->imageFile;
    }

    public function setImageName(?string $imageName): void
    {
        $this->imageName = $imageName;
    }

    public function getImageName(): ?string
    {
        return $this->imageName;
    }

    public function getPublishedAt(): ?\DateTimeImmutable
    {
        return $this->publishedAt;
    }

    public function setPublishedAt(?\DateTimeImmutable $publishedAt): self
    {
        $this->publishedAt = $publishedAt;

        return $this;
    }




    
}

Voci mon FORM

<?php

namespace App\Form;

use App\Entity\Evenement;
use App\Entity\Artiste;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;


class EvenementType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add('imageFile', FileType::class, [
                "required" => false
            ])
            ->add('titre', TextType::class)
            ->add('date', DateTimeType::class, [
                'required' => false
            ])
            ->add('nom', EntityType::class, [
                'required' => false,
                'class' => Artiste::class,
                'choice_label' => 'nom'
            ])
            ->add('presentation', TextareaType::class)

        ;
    }

    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults([
            'data_class' => Evenement::class,
        ]);
    }
}


Avatar du membre
Mammouth du PHP | 1609 Messages

10 juil. 2023, 13:43

Salut,

https://www.google.com/search?client=fi ... table+type
https://symfony.com/doc/current/referen ... html#input

Option input à datetime_immutable dans le form type.
           ->add('date', DateTimeType::class, [
                'required' => false,
                'input' => 'datetime_immutable',
            ])
Développeur web depuis + de 20 ans

Eléphant du PHP | 74 Messages

10 juil. 2023, 14:46

Merci pour ton retour ! Super !

Il m'affiche cette erreur maintenant

Object of class DateTimeImmutable could not be converted to string

https://zupimages.net/up/23/28/4fd7.png

https://zupimages.net/up/23/28/sjce.png

:cry: :cry: :cry: :cry: :cry:

ça à l'air grave j'ai l'impression

Avatar du membre
Mammouth du PHP | 1609 Messages

10 juil. 2023, 17:10

Il semble que ce soit un autre problème, dans le template. Tu dois faire une sorte d'echo twig avec une variable DateTimeImmutable et ça provoque cette erreur. Il faut passer par la méthode format de l'objet ou utiliser le filter twig date.
Développeur web depuis + de 20 ans