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 :
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 :
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
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
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!
Partager