1
1
.. index ::
2
2
single: Doctrine; Simple Registration Form
3
3
single: Form; Simple Registration Form
4
+ single: Security; Simple Registration Form
4
5
5
- How to Implement a simple Registration Form
6
+ How to Implement a Simple Registration Form
6
7
===========================================
7
8
8
9
Creating a registration form is pretty easy - it *really * means just creating
9
- a form that will update some ``User `` model object (a Doctrine entity in this example)
10
- and then save it.
10
+ a form that will update some ``User `` model object (a Doctrine entity in this
11
+ example) and then save it.
11
12
12
13
.. tip ::
13
14
14
- The popular `FOSUserBundle `_ provides a registration form, reset password form
15
- and other user management functionality.
15
+ The popular `FOSUserBundle `_ provides a registration form, reset password
16
+ form and other user management functionality.
16
17
17
18
If you don't already have a ``User `` entity and a working login system,
18
19
first start with :doc: `/cookbook/security/entity_provider `.
@@ -61,27 +62,27 @@ With some validation added, your class may look something like this::
61
62
private $id;
62
63
63
64
/**
64
- * @ORM\Column(type="string", length=255)
65
+ * @ORM\Column(type="string", length=255, unique=true )
65
66
* @Assert\NotBlank()
66
67
* @Assert\Email()
67
68
*/
68
69
private $email;
69
70
70
71
/**
71
- * @ORM\Column(type="string", length=255)
72
+ * @ORM\Column(type="string", length=255, unique=true )
72
73
* @Assert\NotBlank()
73
74
*/
74
75
private $username;
75
76
76
77
/**
77
78
* @Assert\NotBlank()
78
- * @Assert\Length(max = 4096)
79
+ * @Assert\Length(max= 4096)
79
80
*/
80
81
private $plainPassword;
81
82
82
83
/**
83
84
* The below length depends on the "algorithm" you use for encoding
84
- * the password, but this works well with bcrypt
85
+ * the password, but this works well with bcrypt.
85
86
*
86
87
* @ORM\Column(type="string", length=64)
87
88
*/
@@ -124,6 +125,13 @@ With some validation added, your class may look something like this::
124
125
$this->password = $password;
125
126
}
126
127
128
+ public function getSalt()
129
+ {
130
+ // The bcrypt algorithm don't require a separate salt.
131
+ // You *may* need a real salt if you choose a different encoder.
132
+ return null;
133
+ }
134
+
127
135
// other methods, including security methods like getRoles()
128
136
}
129
137
@@ -146,8 +154,10 @@ example, see the :ref:`Entity Provider <security-crete-user-entity>` article.
146
154
only place where you don't need to worry about this is your login form,
147
155
since Symfony's Security component handles this for you.
148
156
149
- Create a Form for the Model
150
- ---------------------------
157
+ .. _create-a-form-for-the-model :
158
+
159
+ Create a Form for the Entity
160
+ ----------------------------
151
161
152
162
Next, create the form for the ``User `` entity::
153
163
@@ -195,8 +205,9 @@ There are just three fields: ``email``, ``username`` and ``plainPassword``
195
205
Handling the Form Submission
196
206
----------------------------
197
207
198
- Next, you need a controller to handle the form. Start by creating a simple
199
- controller for displaying the registration form::
208
+ Next, you need a controller to handle the form rendering and submission. If the
209
+ form is submitted, the controller performs the validation and saves the data
210
+ into the database::
200
211
201
212
// src/AppBundle/Controller/RegistrationController.php
202
213
namespace AppBundle\Controller;
@@ -222,6 +233,7 @@ controller for displaying the registration form::
222
233
// 2) handle the submit (will only happen on POST)
223
234
$form->handleRequest($request);
224
235
if ($form->isSubmitted() && $form->isValid()) {
236
+
225
237
// 3) Encode the password (you could also do this via Doctrine listener)
226
238
$password = $this->get('security.password_encoder')
227
239
->encodePassword($user, $user->getPlainPassword());
@@ -245,6 +257,45 @@ controller for displaying the registration form::
245
257
}
246
258
}
247
259
260
+ To define the algorithm used to encode the password in step 3 configure the
261
+ encoder in the security configuration:
262
+
263
+ .. configuration-block ::
264
+
265
+ .. code-block :: yaml
266
+
267
+ # app/config/security.yml
268
+ security :
269
+ encoders :
270
+ AppBundle\Entity\User : bcrypt
271
+
272
+ .. code-block :: xml
273
+
274
+ <!-- app/config/security.xml -->
275
+ <?xml version =" 1.0" charset =" UTF-8" ?>
276
+ <srv : container xmlns =" http://symfony.com/schema/dic/security"
277
+ xmlns : xsi =" http://www.w3.org/2001/XMLSchema-instance"
278
+ xmlns : srv =" http://symfony.com/schema/dic/services"
279
+ xsi : schemaLocation =" http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd" >
280
+
281
+ <config >
282
+ <encoder class =" AppBundle\Entity\User" >bcrypt</encoder >
283
+ </config >
284
+ </srv : container >
285
+
286
+ .. code-block :: php
287
+
288
+ // app/config/security.php
289
+ $container->loadFromExtension('security', array(
290
+ 'encoders' => array(
291
+ 'AppBundle\Entity\User' => 'bcrypt',
292
+ ),
293
+ ));
294
+
295
+ In this case the recommended ``bcrypt `` algorithm is used. To learn more
296
+ about how to encode the users password have a look into the
297
+ :ref: `security chapter <book-security-encoding-user-password >`.
298
+
248
299
.. note ::
249
300
250
301
If you decide to NOT use annotation routing (shown above), then you'll
0 commit comments