Bonjour à tous,

Je vais exposer deux trois informations avant de poser mon problème.

Moi :
Connaissance de PHP / MySQL : je me débrouille pas mal, ça fais 5 ans que je suis dedans.
Connaissance de Symfony : debutant, j'ai commencé il y a 15 jours ! J'ai fait le super tuto de Jérôme Place (bravo et merci beaucoup) et plusieurs bidouilles perso pour comprendre la base de Symfony (merci au reste de la communauté SF et à google !).


Mon but :
Création d'une messagerie simple (expéditeur 0/n <=> 1/1 message 1/1 <=> 0/n destinataire) en utilisant la gestion d'ultilisateur de FOSUserBundle

Action réalisé :
1- Installation de Symfony,

2- Installation de FOSUserBundle (la base)
- Config de base et Routage de base
- Création d'un MyApp/UserBundle (en utilisant la console),
- Création d'un MyApp/UserBundle/Entity/User.php
- Création de la table User dans la base de donnée (en utilisant la console),
- Ajout de trois utilisateurs.(en utilisant la console),
- Tester, ça fonctionne bien ! sans problème !

3- Création d'un Bundle MessengerBundle (en utilisant la console)
- Création d'un MyApp/MessengerBundle/Entity/Messenger.php
- Création de la table Messenger dans la base de donnée (en utilisant la console),
- Génération du CRUD pour aller plus vite à la génération des formulaires et des vues (en utilisant la console),
- Test d'affichage, tout fonctionne bien
- Restriction de droit dans le security pour forcer une authentifaction pour l'affichage des pages du MessengerBundle
- Test d'affichage, tout fonctionne bien, obliger de se connecter pour voir les pages.
- Modification de fichier MyApp\MessengerBundle\Form\MessengerType.php pour avoir uniquement les champs dont j'ai besoin.
- Test d'insertion d'une entré via le forumaire, ça plante normale, il manque la valeur de from_id, l'utilisateur courant sous forme d'objet User appartenant à MyApp/UserBundle/Entity/User.php et la valeur du champ create_at
- Et là voici mon problème :


Le problème :

- A partir de MessengerController, dans createAction, je n'arrive pas à rajouter ou plutôt à "setter" les deux valeurs manquantes.
J'ai une erreur comme quoi l'objet User n'est pas le User de MyApp/UserBundle/Entity/User.php comme définis dans la class MyApp/MessengerBundle/Entity/Messenger.php

Question :

Est ce qu'il existe une method pour appeler l'User courant ou sommes nous obligé de faire l'appel à chaque fois ( $current_user = $this->container->get('security.context')->getToken()->getUser(); )?

Pourquoi ici mon $current_user n'est pas de ma class MyApp/UserBundle/Entity/User.php.

J'ai le sentiment d'être à coté de la plaque pour la methodologie à employer dans ce genre de cas avec symfony, qu'elle est la bonne methode (donner des exemples et cas concret si possible)

Voici l'erreur :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
 Catchable Fatal Error: Argument 1 passed to MyApp\MessengerBundle\Entity\Messenger::setFrom() must be an instance of MyApp\MessengerBundle\Entity\MyApp\UserBundle\Entity\User, instance of MyApp\UserBundle\Entity\User given, called in /Symfony/src/MyApp/MessengerBundle/Controller/MessengerController.php on line 79 and defined in /Symfony/src/MyApp/MessengerBundle/Entity/Messenger.php line 154

Les fichiers :

MyApp/MessengerBundle/entity/Messenger.php :
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
 
	 <?php
	// MyApp\MessengerBundle\Entity\Messenger.php
	namespace MyApp\MessengerBundle\Entity;
	use Doctrine\ORM\Mapping as ORM;
	use Symfony\Component\Validator\Constraints as Assert;
 
	/**
	* @ORM\Entity
	*/
	class Messenger
	{
	    /**
	    * @ORM\GeneratedValue(strategy="AUTO")
	    * @ORM\Id
	    * @ORM\Column(type="bigint")
	    */
	    private $id;
 
	    /**
	    * @ORM\Column(columnDefinition="varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL")
	    * @Assert\NotBlank()
	    * @Assert\MinLength(3)
	    */    
	    private $object;
 
	    /**
	    * @ORM\Column(columnDefinition="longtext CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL")
	    * @Assert\NotBlank()
	    * @Assert\MinLength(3)
	    */    
	    private $message;
 
	    /** # de la part de 
	    * @ORM\OneToOne(targetEntity="MyApp\UserBundle\Entity\User")
	    * @ORM\JoinColumn(name="from_id", referencedColumnName="id")
	    * @Assert\NotBlank()
	    *
	    * @var User $user
	    */
	    protected $from;
 
	    /** # à l'attention de
	    * @ORM\OneToOne(targetEntity="MyApp\UserBundle\Entity\User")
	    * @ORM\JoinColumn(name="to_id", referencedColumnName="id")
	    * @Assert\NotBlank()
	    *
	    * @var User $user
	    */
	    protected $to;
 
	    /**
	    * @ORM\Column(type="datetime", name="created_at")
	    * @Assert\NotBlank()
	    *
	    * @var DateTime $createdAt
	    */
	    protected $createdAt;
 
	    /**
	    * Get id
	    *
	    * @return bigint 
	    */
	    public function getId()
	    {
		return $this->id;
	    }
 
	    /**
	    * Set object
	    *
	    * @param string $object
	    */
	    public function setObject($object)
	    {
		$this->object = $object;
	    }
 
	    /**
	    * Get object
	    *
	    * @return string 
	    */
	    public function getObject()
	    {
		return $this->object;
	    }
 
	    /**
	    * Set message
	    *
	    * @param string $message
	    */
	    public function setMessage($message)
	    {
		$this->message = $message;
	    }
 
	    /**
	    * Get message
	    *
	    * @return string 
	    */
	    public function getMessage()
	    {
		return $this->message;
	    }
 
	    /**
	    * Set createdAt
	    *
	    * @param datetime $createdAt
	    */
	    public function setCreatedAt($createdAt)
	    {
		$this->createdAt = $createdAt;
	    }
 
	    /**
	    * Get createdAt
	    *
	    * @return datetime 
	    */
	    public function getCreatedAt()
	    {
		return $this->createdAt;
	    }
 
	    /**
	    * Set to
	    *
	    * @param MyApp\UserBundle\Entity\User $to
	    */
	    public function setTo(MyApp\UserBundle\Entity\User $to)
	    {
		$this->to = $to;
	    }
 
	    /**
	    * Get to
	    *
	    * @return MyApp\UserBundle\Entity\User 
	    */
	    public function getTo()
	    {
		return $this->to;
	    }
 
	    /**
	    * Set from
	    *
	    * @param MyApp\UserBundle\Entity\User $from
	    */
	    public function setFrom(MyApp\UserBundle\Entity\User $from)
	    {
		$this->from = $from;
	    }
 
	    /**
	    * Get from
	    *
	    * @return MyApp\UserBundle\Entity\User
	    */
	    public function getFrom()
	    {
		return $this->from;
	    }
	}
MyApp/MessengerBundle/Form/MessengerType.php

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
 
	<?php
	namespace MyApp\MessengerBundle\Form;
 
	use Symfony\Component\Form\AbstractType;
	use Symfony\Component\Form\FormBuilder;
 
	class MessengerType extends AbstractType
	{
	    public function buildForm(FormBuilder $builder, array $options)
	    {
		$builder
		    ->add('to')
		    ->add('object','text')
		    ->add('message','textarea')        
		;
	    }
 
	    public function getName()
	    {
		return 'myapp_messengerbundle_messengertype';
	    }
	}
MyApp/MessengerBundle/Controller/MessengerController.php
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
 
	 ... 
	 public function createAction()
	  {
		$current_user = $this->container->get('security.context')->getToken()->getUser();  
 
		$entity  = new Messenger();
		$entity->setCreatedAt(date('Y-m-d H-i-s'));
		$entity->setFrom($current_user);
 
		$request = $this->getRequest();
		$form    = $this->createForm(new MessengerType(), $entity);
		$form->bindRequest($request);
 
		if ($form->isValid()) {
		    $em = $this->getDoctrine()->getEntityManager();
		    $em->persist($entity);
		    $em->flush();
 
		    return $this->redirect($this->generateUrl('messenger__show', array('id' => $entity->getId())));
		}
 
		return $this->render('MyAppMessengerBundle:Messenger:new.html.twig', array(
		    'entity' => $entity,
		    'form'   => $form->createView()
		));
	  }
	...
A aussi, j'ai tous plein de questions bêtes à poser mais je ne sais pas si je dois faire une post pour chaque question ou bien un post unique avec toutes mes questions ?
Par exemple : Comment mettre un label vide avec le builder ?

Merci d'avance pour vos réponses!