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:$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:
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:
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:
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: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 ?