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
@@ -196,8 +206,9 @@ There are just three fields: ``email``, ``username`` and ``plainPassword``
196
206
Handling the Form Submission
197
207
----------------------------
198
208
199
- Next, you need a controller to handle the form. Start by creating a simple
200
- controller for displaying the registration form::
209
+ Next, you need a controller to handle the form rendering and submission. If the
210
+ form is submitted, the controller performs the validation and saves the data
211
+ into the database::
201
212
202
213
// src/AppBundle/Controller/RegistrationController.php
203
214
namespace AppBundle\Controller;
@@ -223,6 +234,7 @@ controller for displaying the registration form::
223
234
// 2) handle the submit (will only happen on POST)
224
235
$form->handleRequest($request);
225
236
if ($form->isSubmitted() && $form->isValid()) {
237
+
226
238
// 3) Encode the password (you could also do this via Doctrine listener)
227
239
$password = $this->get('security.password_encoder')
228
240
->encodePassword($user, $user->getPlainPassword());
@@ -246,6 +258,45 @@ controller for displaying the registration form::
246
258
}
247
259
}
248
260
261
+ To define the algorithm used to encode the password in step 3 configure the
262
+ encoder in the security configuration:
263
+
264
+ .. configuration-block ::
265
+
266
+ .. code-block :: yaml
267
+
268
+ # app/config/security.yml
269
+ security :
270
+ encoders :
271
+ AppBundle\Entity\User : bcrypt
272
+
273
+ .. code-block :: xml
274
+
275
+ <!-- app/config/security.xml -->
276
+ <?xml version =" 1.0" charset =" UTF-8" ?>
277
+ <srv : container xmlns =" http://symfony.com/schema/dic/security"
278
+ xmlns : xsi =" http://www.w3.org/2001/XMLSchema-instance"
279
+ xmlns : srv =" http://symfony.com/schema/dic/services"
280
+ xsi : schemaLocation =" http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd" >
281
+
282
+ <config >
283
+ <encoder class =" AppBundle\Entity\User" >bcrypt</encoder >
284
+ </config >
285
+ </srv : container >
286
+
287
+ .. code-block :: php
288
+
289
+ // app/config/security.php
290
+ $container->loadFromExtension('security', array(
291
+ 'encoders' => array(
292
+ 'AppBundle\Entity\User' => 'bcrypt',
293
+ ),
294
+ ));
295
+
296
+ In this case the recommended ``bcrypt `` algorithm is used. To learn more
297
+ about how to encode the users password have a look into the
298
+ :ref: `security chapter <book-security-encoding-user-password >`.
299
+
249
300
.. note ::
250
301
251
302
If you decide to NOT use annotation routing (shown above), then you'll
0 commit comments