パスワード属性を持つユーザーエンティティの Symfony での検証を書いています。
namespace AppBundle\Entity;
...
class User implements UserInterface {
...
/**
* @ORM\Column(type="string")
*/
private $password;
/**
* @Assert\NotBlank(message="Veuillez indiquer un mot de passe")
* @Assert\Length(
* min=8,
* max=4096,
* minMessage="Votre mot de passe doit contenir au moins {{limit}} cacactères",
* maxMessage="Votre mot de passe ne doit pas contenir plus de {{limit}} caractères"
* )
*/
private $plain_password;
...
}
ご覧のとおり、パスワードが空にならないようにし、その長さが 8 文字以上であることを確認します。
さらに、Symfony が提供する「繰り返し」タイプのおかげで、サインアップ フォームにパスワードの確認を追加しました。
namespace AppBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\UrlType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
class UserFormType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('email', EmailType::class)
->add('plain_password', RepeatedType::class, [
'type' => PasswordType::class,
'first_name' => 'first',
'second_name' => 'confirmation',
'invalid_message' => 'La confirmation ne correspond pas avec le mot de passe'
])
->add('firstname')
->add('lastname')
->add('city')
->add('website', UrlType::class)
->add('facebook')
->add('twitter')
->add('instagram')
->add('avatar')
->add('submit', SubmitType::class);
}
public function configureOptions(OptionsResolver $resolver) {
$resolver->setDefaults([
'data_class' => 'AppBundle\Entity\User'
]);
}
}
ここで、パスワード フィールドを空白にしてフォームを送信すると、適切なメッセージ"Veuillez indiquer un mot de passe"が表示されます。
2 つのパスワード フィールドに異なる値を指定してフォームを送信すると、適切なメッセージも表示されます。
しかし、2 つのパスワード フィールドに空白ではなく等しい値を指定してフォームを送信すると、長さが 8 未満になります。エラー メッセージは表示されず*、ユーザーは安全に保存されます。
編集:
Alsatian: フォームに検証グループが設定されていません
コントローラーのアクション:
public function signupAction(Request $request) {
$user = new User();
$form = $this->createForm(UserFormType::class, $user);
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($user);
$em->flush();
return $this->redirectToRoute('home');
}
return $this->render('user/signup.html.twig', [
'form' => $form->createView()
]);
}