Bonjour à tous,
J'ai voulu m’entraîner sur du symfony3 en créant une classe user custom. La classe fonctionne bien, je peux créer mes users sans problème.
Je suis passé à l'étape suivante à savoir un CRUD pour les users en utilisant Sonata. L'installation de sonata est ok le listing des users et leurs suppressions aussi mais pas la création. En effet je n'arrive pas à utilise la fonction d'encodage proposé dans la doc de symfony.
mon entité 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
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
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192 <?php namespace AppBundle\Entity; use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Validator\Constraints as Assert; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; use Symfony\Component\Security\Core\User\UserInterface; /* implémentation manuel d'un user selon la doc sf3.3 * utilisation des champs email et username en unique pour ne pas avoir de doublon */ /** * @ORM\Table(name="users") * @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository") * @UniqueEntity(fields="email", message="Email already taken") * @UniqueEntity(fields="username", message="Username already taken") */ class User implements UserInterface, \Serializable { /** * @ORM\Column(type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @ORM\Column(type="string", length=25, unique=true) */ private $username; /** * @ORM\Column(type="string", length=25) */ private $firstname; /** * @ORM\Column(type="string", length=25) */ private $lastname; /** * @ORM\Column(type="string", length=64) */ private $password; // A noter l'absence de @ORM\Column plainPassword n'est pas enregistré en bdd //sert juste pour vérifier le mdp du user /** * @Assert\NotBlank() * @Assert\Length(max=4096) */ private $plainPassword; /** * @ORM\Column(type="string", length=60, unique=true) */ private $email; /** * @ORM\Column(type="array") */ private $roles; /** * @ORM\Column(name="is_active", type="boolean") */ private $isActive; public function __construct() { $this->isActive = true; // may not be needed, see section on salt below // $this->salt = md5(uniqid(null, true)); } public function getSalt() { // you *may* need a real salt depending on your encoder // see section on salt below return null; } public function getRoles() { return $this->roles; } public function setRoles($role) { $this->roles = $role; } public function eraseCredentials() { } public function getId() { return $this->id; } public function getUsername() { return $this->username; } public function getPassword() { return $this->password; } public function getEmail() { return $this->email; } public function getIsActive() { return $this->isActive; } public function setId($id) { $this->id = $id; } public function setUsername($username) { $this->username = $username; } public function setPassword($password) { $this->password = $password; } public function setEmail($email) { $this->email = $email; } public function getFirstname() { return $this->firstname; } public function getLastname() { return $this->lastname; } public function setFirstname($firstname) { $this->firstname = $firstname; } public function setLastname($lastname) { $this->lastname = $lastname; } public function setIsActive($isActive) { $this->isActive = $isActive; } public function getPlainPassword() { return $this->plainPassword; } public function setPlainPassword($plainPassword) { $this->plainPassword = $plainPassword; } /** @see \Serializable::serialize() */ public function serialize() { return serialize(array( $this->id, $this->username, $this->password, // see section on salt below // $this->salt, )); } /** @see \Serializable::unserialize() */ public function unserialize($serialized) { list ( $this->id, $this->username, $this->password, // see section on salt below // $this->salt ) = unserialize($serialized); } }
le code du registration (avec le encode password qui fonctionne bien dans ce cas la )
Par contre je n'arrive pas à utilise le encodePassword dans ma classe spécifique à sonata.
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 AppBundle\Controller; use AppBundle\Form\UserType; use AppBundle\Entity\User; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface; use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; class RegistrationController extends Controller { /** * @Route("/register", name="user_registration") */ public function registerAction(Request $request, UserPasswordEncoderInterface $passwordEncoder, \Swift_Mailer $mailer) { $user = new User(); $form = $this->createForm(UserType::class, $user); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { // utilisation de PlainPassword mais seul le password encodé est enregistré $password = $passwordEncoder->encodePassword($user, $user->getPlainPassword()); $user->setPassword($password); // sauvegarde du user $em = $this->getDoctrine()->getManager(); $em->persist($user); $em->flush(); } }
En commentaire j'ai indiqué mes tentatives.
Si quelqu'un à une astuce je suis preneur.
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 <?php namespace AppBundle\Admin; use Sonata\AdminBundle\Admin\AbstractAdmin; use Sonata\AdminBundle\Show\ShowMapper; use Sonata\AdminBundle\Form\FormMapper; use Sonata\AdminBundle\Datagrid\ListMapper; use Sonata\AdminBundle\Datagrid\DatagridMapper; use Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder; use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface; use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; use Symfony\Component\Security\Core\Encoder\UserPasswordEncoder; use AppBundle\Entity\User; class UserAdmin extends AbstractAdmin { //https://sonata-project.org/bundles/admin/master/doc/reference/getting_started.html // champs visible pour create/edit forms protected function configureFormFields(FormMapper $formMapper) { $formMapper //lecture de l'ensemble des propriétés de l'entité de la classe user ->add('username') ->add('firstname') ->add('lastname') ->add('email') ->add('plainPassword', 'password') ->add('roles', 'choice', array('choices' => array( 'ROLE_ADMIN' => 'ROLE_ADMIN', 'ROLE_MANAGER' => 'ROLE_MANAGER', 'ROLE_USER' => 'ROLE_USER'), 'multiple' => true,)) ->add('isActive') ; } // Fields to be shown on filter forms protected function configureDatagridFilters(DatagridMapper $datagridMapper) { $datagridMapper ->add('username') ->add('firstname') ->add('lastname') ->add('email') ->add('isActive') ; } // Fields to be shown on lists protected function configureListFields(ListMapper $listMapper) { $listMapper ->add('username') ->add('firstname') ->add('lastname') ->add('email') ->add('isActive') ; } // Fields to be shown on show action protected function configureShowFields(ShowMapper $showMapper) { $showMapper ->add('username') ->add('firstname') ->add('lastname') ->add('email') ->add('isActive') ; } //avant d'enregistrer les infos en bdd // verification que c'est bien un objet user // sur le password prendre celui du plain text et l'encoder dans la proprieté password public function prePersist($object) { if($object instanceof User != TRUE){ return false; }else{ $textPassword = $object->getPlainPassword(); //check au cas si le password n'est pas vide if(!empty($textPassword)){ // $logger = $this->container->get('security.password_encoder'); => n'etendant pas un BaseControlleur $this->container n'est pas disponible $logger = $this->get('EncodePassword'); // $encodePassword = $logger->encodePassword($object, $textPassword, $toto); => ne fonctionne pas var_dump($encodePassword);die; }else{ return FALSE; } } var_dump($object);die; } }
En vous remerciant.
Partager