IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

[ERROR] Symfony 4. Je ne comprends pas cette erreur.


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2019
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2019
    Messages : 12
    Par défaut [ERROR] Symfony 4. Je ne comprends pas cette erreur.
    Bonjour à tous!

    Je travaille sur un projet symfony 4.3. Je crée un CRUD manuellement (sans la commande make:crud) pour une entité Appointment, pour gérer l'ajout, la modification et la suppression de rdv. J'ai eu cette erreur que je ne comprends pas :

    Catchable Fatal Error: Object of class App\Entity\Customer could not be converted to string
    Je vous mets rapidement les étapes que j'ai effectué:
    _ création de l'entité Appointment (id, idUser, idCustomer, idPlace, date) avec relation (entités User, Customer, Place).
    _ création d'un AppointmentController, avec les méthodes index et new, ainsi que les templates correspondants.

    Quand je vais sur la route /appointment qui fait appel à la méthode index, j'ai bien mon tableau qui s'affiche même si je n'ai pas encore de données dans ma liste.
    Mais quand je vais sur la route /appointment/new pour créer un rdv, c'est là que cette erreur apparaît. Je ne comprends pas ce que j'ai loupé ou alors où est mon erreur dans mon code.

    Pourriez-vous m'éclairer svp ?

    Voici le code du Controller:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    <?php
     
    namespace App\Controller;
     
    use App\Entity\Appointment;
    use App\Form\AppointmentType;
    use App\Repository\AppointmentRepository;
    use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\Routing\Annotation\Route;
     
    class AppointmentController extends AbstractController
    {
        /**
         * @Route("/appointment", name="appointment")
         */
        public function index(AppointmentRepository $appointmentRepository)
        {
            return $this->render('appointment/index.html.twig', [
                'appointments' => $appointmentRepository->findAll(),
            ]);
        }
     
        /**
         * @Route("/appointment/new", name = "appointment_new", methods = {"GET", "POST"})
         */
     
        public function new(Request $request) : Response {
     
            $appointments = new Appointment();
            $form = $this->createForm(AppointmentType::class, $appointments);
            $form->handleRequest($request);
     
            if($form->isSubmitted() && $form->isValid()) {
                $em = $this->getDoctrine()->getManager();
                $em->persist($appointments);
                $em->flush();
     
                return $this->redirectToRoute('appointment');
            }
     
            return $this->render('appointment/new.html.twig', [
                'appointments' => $appointments,
                'form' => $form->createView(),
            ]);
        }
     
    }
    Le code de l'entité Appointment) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
    <?php
     
    namespace App\Entity;
     
    use DateTimeInterface;
    use Doctrine\ORM\Mapping as ORM;
     
    /**
     * @ORM\Entity(repositoryClass="App\Repository\AppointmentRepository")
     */
    class Appointment
    {
        /**
         * @ORM\Id()
         * @ORM\GeneratedValue()
         * @ORM\Column(type="integer")
         */
        private $id;
     
        /**
         * @ORM\OneToOne(targetEntity="App\Entity\User", inversedBy="appointment", cascade={"persist", "remove"})
         */
        private $idUser;
     
        /**
         * @ORM\OneToOne(targetEntity="App\Entity\Customer", inversedBy="appointment", cascade={"persist", "remove"})
         */
        private $idCustomer;
     
        /**
         * @ORM\OneToOne(targetEntity="App\Entity\Place", inversedBy="appointment", cascade={"persist", "remove"})
         */
        private $idPlace;
     
        /**
         * @ORM\Column(type="datetime")
         */
        private $date;
     
        public function getId(): ?int
        {
            return $this->id;
        }
     
        public function getIdUser(): ?User
        {
            return $this->idUser;
        }
     
        public function setIdUser(?User $idUser): self
        {
            $this->idUser = $idUser;
     
            return $this;
        }
     
        public function getIdCustomer(): ?Customer
        {
            return $this->idCustomer;
        }
     
        public function setIdCustomer(?Customer $idCustomer): self
        {
            $this->idCustomer = $idCustomer;
     
            return $this;
        }
     
        public function getIdPlace(): ?Place
        {
            return $this->idPlace;
        }
     
        public function setIdPlace(?Place $idPlace): self
        {
            $this->idPlace = $idPlace;
     
            return $this;
        }
     
        public function getDate(): ?DateTimeInterface // il y avait un \ avant chaque DateTimeInterface
        {
            return $this->date;
        }
     
        public function setDate(DateTimeInterface $date): self
        {
            $this->date = $date;
     
            return $this;
        }
    }
    Merci!

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Par défaut
    "Catchable Fatal Error: Object of class App\Entity\Customer could not be converted to string"
    bonjour,
    l'erreur indique que tu tentes d'afficher l'objet Customer. Pour afficher cet objet tu dois redéfinir la méthode __toString qui doit retourner une propriété typée string de la classe Customer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class Customer{
     
        /**
         * @var string
         *
         * @ORM\Column(type="string")
         */
        private $name;
     
       public function __toString() :string {
            return $this->name;
        }
    }
    cette erreur d'affichage a située probablement dans le formulaire AppointmentType.

  3. #3
    Membre averti
    Femme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2019
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2019
    Messages : 12
    Par défaut
    ça fonctionne ! merci

    Maintenant, je passe à une autre problématique qui est mon formulaire.

    Alors, pour l'instant mon formulaire affiche un select pour mon label idUser avec en option les id des user. Or, j'aimerai qu'il affiche en plus de l'id, le nom et prénom qui sont des champs existant dans ma table user. Et que le tout s'ajoute à ma table appointment en BDD. Pour ne pas me retrouver qu'avec des numéros et ne pas savoir à qui correspond tel ou tel id.
    Mais je ne sais pas comment m'y prendre. Je pense que je devrais faire des modifications dans le fichier AppointmentType mais je ne suis pas sûr. Et comme je ne sais pas par où commencer, je ne sais pas comment orienter mes recherches.

    Si quelqu'un peut m'aider. Merci beaucoup.

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Par défaut
    avec le type de champ EntityType tu peux indiquer dans les options ce que tu souhaites afficher comme label.( https://symfony.com/doc/current/reference/forms/types/entity.html#field-options )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $builder->add('user', EntityType::class, [
        'class' => User::class,
        'choice_label' => function ($user) {
            return $user->getNom() . " " . $user->getId();
        }
    ]);
    après je n'ai pas connaissance de tes entités et des relations sous-jacentes.

  5. #5
    Membre averti
    Femme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2019
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2019
    Messages : 12
    Par défaut
    Merci! cela affiche bien les infos dans le formulaire.

    Par contre j'ai eu cette erreur après avoir valider le formulaire :

    An exception occurred while executing 'INSERT INTO appointment (date, id_user_id, id_customer_id, id_place_id) VALUES (?, ?, ?, ?)' with params ["2020-02-04 00:00:00", 2, 7, 1]:

    SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '2' for key 'UNIQ_FE38F84479F37AE5'
    A quel endroit je dois regarder pour trouver quoi modifier ?

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Par défaut
    la relation OneToOne entre User et Appointment signifie qu'un utilisateur ne peut prendre RDV qu'une et une seule fois. Dans le cas d'espèce le user numéro 2 a déjà pris RDV donc il ne peut en prendre à nouveau. Pour les mêmes raisons entre Customer et Apointment, un client ne peut prendre RDV qu'une et une seule fois.

    Il faut configurer une autre relation de type ManyToOne entre Appointment et Customer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    class Appointment {
     
        /**
         * @ORM\ManyToOne(targetEntity="Customer", inversedBy="appointments")
         */
        private $customer; //pas de idMachin car on manipule les objets du côtés de doctrine c'est juste une question de sémantique
     
    }
     
     
    class Customer {
     
        /**
         * @ORM\OneToMany(targetEntity="Appointment", mappedBy="customer")
         */
        private $appointments;
     
    }
    Par ailleurs ça ne sert à rien de configurer une relation entre les entités User et Appointment car à partir d'un client tu peux retrouver les informations de cet User(login, password,email...).

Discussions similaires

  1. [PHPExcel] Comprend pas cette écriture ?
    Par a028762 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 05/07/2009, 15h07
  2. Je ne comprends pas cette ligne de code
    Par beegees dans le forum C++
    Réponses: 17
    Dernier message: 13/05/2008, 11h02
  3. fatal error dans php je ne comprend pas
    Par patchouli dans le forum Langage
    Réponses: 10
    Dernier message: 09/01/2007, 23h34
  4. Comprend pas cette commande SED
    Par DIE dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 05/10/2006, 13h58
  5. [Boolean]Je ne comprend pas cette instruction
    Par jcachico dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 13/01/2006, 16h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo