If you liked what you've learned so far, dive in!
Subscribe to get access to this tutorial plus
video, code and script downloads.
Ready for the problem? Right now, we need the plainPassword
to be required. But
later when we create an edit profile page, we don't want to make plainPassword
required. Remember, this is not saved to the database. So if the user leaves it
blank on the edit form, it just means they don't want to change their password.
And that should be allowed.
So, we need this annotation to only work on the registration form.
Here's how you do it: take advantage of something called validation groups. On the
NotBlank
constraint, add groups={"Registration"}
:
... lines 1 - 15 | |
class User implements UserInterface | |
{ | |
... lines 18 - 38 | |
/** | |
... line 40 | |
* @Assert\NotBlank(groups={"Registration"}) | |
... lines 42 - 43 | |
*/ | |
private $plainPassword; | |
... lines 46 - 116 | |
} |
This "Registration" is a string I just invented: there's no significance to it.
Without doing anything else, go back, hit register, and check it out! The error went
away. Here's what's happening: by default, all constraints live in a group called
Default
. And when your form is validated, it validates all constraints in this
Default
group. So now that we've put this into a different group called
Registration
, when the form validates, it doesn't validate using this constraint.
To use this annotation only on the registration form, we need to make that
form validate everything in the Default
group and the Registration
group.
Open up UserRegistrationForm
and add a second option to setDefaults()
: validation_groups
set to Default
- with a capital D
and then Registration
:
... lines 1 - 12 | |
class UserRegistrationForm extends AbstractType | |
{ | |
... lines 15 - 23 | |
public function configureOptions(OptionsResolver $resolver) | |
{ | |
$resolver->setDefaults([ | |
... line 27 | |
'validation_groups' => ['Default', 'Registration'] | |
]); | |
} | |
} |
That should do it. Refresh: validation is back.
Ok team: one final mission: automatically authenticate the user after registration. Because really, that's what our users want.
// composer.json
{
"require": {
"php": ">=5.5.9",
"symfony/symfony": "3.1.*", // v3.1.4
"doctrine/orm": "^2.5", // v2.7.2
"doctrine/doctrine-bundle": "^1.6", // 1.6.4
"doctrine/doctrine-cache-bundle": "^1.2", // 1.3.0
"symfony/swiftmailer-bundle": "^2.3", // v2.3.11
"symfony/monolog-bundle": "^2.8", // 2.11.1
"symfony/polyfill-apcu": "^1.0", // v1.2.0
"sensio/distribution-bundle": "^5.0", // v5.0.22
"sensio/framework-extra-bundle": "^3.0.2", // v3.0.16
"incenteev/composer-parameter-handler": "^2.0", // v2.1.2
"composer/package-versions-deprecated": "^1.11", // 1.11.99
"knplabs/knp-markdown-bundle": "^1.4", // 1.4.2
"doctrine/doctrine-migrations-bundle": "^1.1" // 1.1.1
},
"require-dev": {
"sensio/generator-bundle": "^3.0", // v3.0.7
"symfony/phpunit-bridge": "^3.0", // v3.1.3
"nelmio/alice": "^2.1", // 2.1.4
"doctrine/doctrine-fixtures-bundle": "^2.3" // 2.3.0
}
}