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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
$factory = $this->get('security.encoder_factory');
fonctionnait très bien !

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 :
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',
        );
    }
}
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
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 ?