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 $encoder = $this->get('security.encoder_factory')
228240 ->getEncoder($user);
@@ -249,6 +261,45 @@ controller for displaying the registration form::
249261 }
250262 }
251263
264+ To define the algorithm used to encode the password in step 3 configure the
265+ encoder in the security configuration:
266+
267+ .. configuration-block ::
268+
269+ .. code-block :: yaml
270+
271+ # app/config/security.yml
272+ security :
273+ encoders :
274+ AppBundle\Entity\User : bcrypt
275+
276+ .. code-block :: xml
277+
278+ <!-- app/config/security.xml -->
279+ <?xml version =" 1.0" charset =" UTF-8" ?>
280+ <srv : container xmlns =" http://symfony.com/schema/dic/security"
281+ xmlns : xsi =" http://www.w3.org/2001/XMLSchema-instance"
282+ xmlns : srv =" http://symfony.com/schema/dic/services"
283+ xsi : schemaLocation =" http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd" >
284+
285+ <config >
286+ <encoder class =" AppBundle\Entity\User" >bcrypt</encoder >
287+ </config >
288+ </srv : container >
289+
290+ .. code-block :: php
291+
292+ // app/config/security.php
293+ $container->loadFromExtension('security', array(
294+ 'encoders' => array(
295+ 'AppBundle\Entity\User' => 'bcrypt',
296+ ),
297+ ));
298+
299+ In this case the recommended ``bcrypt `` algorithm is used. To learn more
300+ about how to encode the users password have a look into the
301+ :ref: `security chapter <book-security-encoding-user-password >`.
302+
252303.. note ::
253304
254305 If you decide to NOT use annotation routing (shown above), then you'll
0 commit comments