Bonsoir à tous,
J'ai à nouveau des ennuis avec le méchant Symfony2 ! Nen je rigole il est très gentil, mais parfois capricieux.
J'ai créé un formulaire (en trois parties avec le handler et le type et le reste dans le contrôleur ) et je dois aller chercher le service encoder factory pour encoder mes mots de passe. Quand mon formulaire était en une seule partie, tout fonctionnait bien et la commande
fonctionnait très bien !
Code : Sélectionner tout - Visualiser dans une fenêtre à part $factory = $this->get('security.encoder_factory');
Mais la, j'ai un soucis c'est que quand j'appelle le service au sein de mon FormHandler, ça ne fonctionne plus ! J'ai une belle erreur.
Voici les codes de mes formulaires :
RegisterHandler :
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 <?php namespace AudioSuivi\UserBundle\Form\Handler; use Symfony\Component\Form\Form; use Symfony\Component\HttpFoundation\Request; use Doctrine\ORM\EntityManager; use AudioSuivi\UserBundle\Entity\User; class RegisterHandler { protected $form; protected $request; protected $em; public function __construct(Form $form, Request $request, EntityManager $em) { $this->form = $form; $this->request = $request; $this->em = $em; } public function process() { if( $this->request->getMethod() == 'POST' ) { $this->form->bindRequest($this->request); if( $this->form->isValid() ) { $this->onSuccess($this->form->getData()); return true; } } return false; } public function onSuccess(User $user) { // Appelle du service encoder_factory $factory = $this->get('security.encoder_factory'); // Récupération du mot de passe entré par l'utilisateur dans le formulaire $password = $user->getPassword(); // Lie l'objet $user à l'encoder $encoder = $factory->getEncoder($user); // Encodage du mot de passe en sha512 (précisé dans le security.yml $password_encode = $encoder->encodePassword($password, $user->getSalt()); // Hydratation de l'utilisateur avec le password encodé $user->setPassword($password_encode); // Création de l'utilisateur $this->em->persist($user); $this->em->flush(); } }
RegisterType :
Le contrôleur est tout à fait classique :
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 <?php namespace AudioSuivi\UserBundle\Form\Type; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilder; class RegisterType extends AbstractType { public function buildForm(FormBuilder $builder, array $options) { $builder ->add('username', 'text') ->add('email', 'text') ->add('password', 'repeated', array('type' => 'password', 'invalid_message' => 'Mot de passe incorrect, veuillez vérifier', 'first_name' => 'Mot de passe', 'second_name' => 'Vérification',)); } public function getName() { return 'audiosuivi_userbundle_registertype'; } public function getDefaultOptions(array $options) { return array( 'data_class' => 'AudioSuivi\UserBundle\Entity\User', ); } }
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 <?php namespace AudioSuivi\UserBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use AudioSuivi\UserBundle\Entity\User; use AudioSuivi\UserBundle\Entity\Group; use Audiosuivi\UserBundle\Form\Type\RegisterType; use AudioSuivi\UserBundle\Form\Handler\RegisterHandler; class RegisterController extends Controller { public function registerAction() { // Création de l'objet User $user = New User; // Appelle du service encoder_factory $factory = $this->get('security.encoder_factory'); // On appelle le formulaire RegisterType.php $form = $this->createForm(new RegisterType, $user); // Appelle de RegisterHandler pour gérer le traitement du formulaire $formHandler = new RegisterHandler($form, $this->get('request'), $this->getDoctrine()->getEntityManager()); // Execution du traitement du formulaire if( $formHandler->process() ) { // Redirection vers la page d'accueil, pour l'instant return $this->redirect( $this->generateUrl('_welcome') ); } // Création de la vue du formulaire avec createView return $this->render('AudioSuiviUserBundle:Register:register.html.twig', array('form' => $form->createView())); } }
Et donc quand j'essaye d'inscrire un membre, j'ai cette erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part Fatal error: Call to undefined method AudioSuivi\UserBundle\Form\Handler\RegisterHandler::get() in D:\wamp\www\Audiosuivi\src\AudioSuivi\UserBundle\Form\Handler\RegisterHandler.php on line 40
Je ne comprends pas du tout pourquoi ! Alors que quand j'appelais le service dans le contrôleur tout allait bien.. Sauriez-vous pourquoi ?
Partager