2

パスワード属性を持つユーザーエンティティの 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()
    ]);
}
4

0 に答える 0