11.. index ::
22 single: Doctrine; Simple Registration Form
33 single: Form; Simple Registration Form
4+ single: Security; Simple Registration Form
45
5- How to Implement a simple Registration Form
6+ How to Implement a Simple Registration Form
67===========================================
78
89Creating 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.
1112
1213.. tip ::
1314
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.
1617
1718If you don't already have a ``User `` entity and a working login system,
1819first start with :doc: `/cookbook/security/entity_provider `.
@@ -61,27 +62,27 @@ With some validation added, your class may look something like this::
6162 private $id;
6263
6364 /**
64- * @ORM\Column(type="string", length=255)
65+ * @ORM\Column(type="string", length=255, unique=true )
6566 * @Assert\NotBlank()
6667 * @Assert\Email()
6768 */
6869 private $email;
6970
7071 /**
71- * @ORM\Column(type="string", length=255)
72+ * @ORM\Column(type="string", length=255, unique=true )
7273 * @Assert\NotBlank()
7374 */
7475 private $username;
7576
7677 /**
7778 * @Assert\NotBlank()
78- * @Assert\Length(max = 4096)
79+ * @Assert\Length(max= 4096)
7980 */
8081 private $plainPassword;
8182
8283 /**
8384 * 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.
8586 *
8687 * @ORM\Column(type="string", length=64)
8788 */
@@ -124,6 +125,13 @@ With some validation added, your class may look something like this::
124125 $this->password = $password;
125126 }
126127
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+
127135 // other methods, including security methods like getRoles()
128136 }
129137
@@ -146,8 +154,10 @@ example, see the :ref:`Entity Provider <security-crete-user-entity>` article.
146154 only place where you don't need to worry about this is your login form,
147155 since Symfony's Security component handles this for you.
148156
149- Create a Form for the Model
150- ---------------------------
157+ .. _create-a-form-for-the-model :
158+
159+ Create a Form for the Entity
160+ ----------------------------
151161
152162Next, create the form for the ``User `` entity::
153163
@@ -196,8 +206,9 @@ There are just three fields: ``email``, ``username`` and ``plainPassword``
196206Handling the Form Submission
197207----------------------------
198208
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::
201212
202213 // src/AppBundle/Controller/RegistrationController.php
203214 namespace AppBundle\Controller;
@@ -223,6 +234,7 @@ controller for displaying the registration form::
223234 // 2) handle the submit (will only happen on POST)
224235 $form->handleRequest($request);
225236 if ($form->isSubmitted() && $form->isValid()) {
237+
226238 // 3) Encode the password (you could also do this via Doctrine listener)
227239 $password = $this->get('security.password_encoder')
228240 ->encodePassword($user, $user->getPlainPassword());
@@ -246,6 +258,45 @@ controller for displaying the registration form::
246258 }
247259 }
248260
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+
249300.. note ::
250301
251302 If you decide to NOT use annotation routing (shown above), then you'll
0 commit comments