FOSUserBundle Invitation ======================== Require an invitation to create a new user is a pattern mostly used for early stage of a project. User enter their invitation code in order to register. Invitation model ---------------- First we need to add the invitation entity. An invitation is represented by a unique code/identifier generated in the constructor:: code = substr(md5(uniqid(rand(), true)), 0, 6); } public function getCode() { return $this->code; } public function getEmail() { return $this->email; } public function setEmail($email) { $this->email = $email; } public function isSent() { return $this->sent; } public function send() { $this->sent = true; } } Next we map our ``Invitation`` entity to our ``User`` with a one-to-one association:: invitation = $invitation; } public function getInvitation() { return $this->invitation; } } Add invitation to RegistrationFormType -------------------------------------- Override the default registration form with your own:: add('invitation', 'AppBundle\Form\InvitationFormType'); } public function getParent() { return 'FOS\UserBundle\Form\Type\RegistrationFormType'; } public function getBlockPrefix() { return 'app_user_registration'; } // Not necessary on Symfony 3+ public function getName() { return 'app_user_registration'; } } Create the invitation field:: invitationTransformer = $invitationTransformer; } public function buildForm(FormBuilderInterface $builder, array $options) { $builder->addModelTransformer($this->invitationTransformer); } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults(array( 'class' => 'AppBundle\Entity\Invitation', 'required' => true, )); } public function getParent() { return 'Symfony\Component\Form\Extension\Core\Type\TextType'; } public function getBlockPrefix() { return 'app_invitation_type'; } // Not necessary on Symfony 3+ public function getName() { return 'app_invitation_type'; } } Create the custom data transformer:: entityManager = $entityManager; } public function transform($value) { if (null === $value) { return null; } if (!$value instanceof Invitation) { throw new UnexpectedTypeException($value, 'AppBundle\Entity\Invitation'); } return $value->getCode(); } public function reverseTransform($value) { if (null === $value || '' === $value) { return null; } if (!is_string($value)) { throw new UnexpectedTypeException($value, 'string'); } $dql = <<entityManager ->createQuery($dql) ->setParameter('code', $value) ->setMaxResults(1) ->getOneOrNullResult(); } } Register your custom form type in the container: .. configuration-block:: .. code-block:: yaml # app/config/services.yml services: app.form.registration: class: AppBundle\Form\RegistrationFormType tags: - { name: "form.type", alias: "app_user_registration" } app.form.invitation: class: AppBundle\Form\InvitationFormType arguments: ['@app.form.data_transformer.invitation'] tags: - { name: "form.type", alias: "app_invitation_type" } app.form.data_transformer.invitation: class: AppBundle\Form\DataTransformer\InvitationToCodeTransformer arguments: ['@doctrine.orm.entity_manager'] public: false .. code-block:: xml Next overwrite the default ``RegistrationFormType`` with the one just created : .. code-block:: yaml # app/config/config.yml fos_user: registration: form: type: AppBundle\Form\RegistrationFormType You are done, go to your registration form to see the result.