🎻

[Symfony] 現在のパスワードも確認のために入力させるパスワード変更フォームの作り方

2020/04/21に公開

こういうフォームの作り方です。

結論

UserPassword Constraintsを使えば簡単に作れます👍

具体的なコード例

FormType

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Security\Core\Validator\Constraints as SecurityAssert;
use Symfony\Component\Validator\Constraints as Assert;

class UserChangePasswordType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('oldPassword', PasswordType::class, [
                'label' => '現在のパスワード',
                'constraints' => [
                    new Assert\NotBlank(),
                    new SecurityAssert\UserPassword([
                        'message' => '現在のパスワードが正しくありません',
                    ]),
                ],
            ])
            ->add('newPassword', PasswordType::class, [
                'label' => '新しいパスワード',
                'constraints' => [
                    new Assert\NotBlank(),
                ],
            ])
        ;
    }
}

こんな感じで、「現在のパスワード」のほうに UserPassword Constraintsをセットします。

これだけで、ログイン中のユーザーのパスワードが正しく入力されたかどうかをチェックしてくれます。便利〜!

コントローラ

あとはコントローラ側で普通にフォームから受け取った「新しいパスワード」の文字列をエンコードして保存すればOKです。

public function changePasswordAction(Request $request, UserPasswordEncoderInterface $encoder)
{
    $user = $this->getUser();

    $form = $this->createForm(UserChangePasswordType::class);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $user->setPassword($encoder->encodePassword($user, $form->get('newPassword')->getData()));

        $this->em->persist($user);
        $this->em->flush();

        $this->addFlash('success', 'パスワードの変更が完了しました。');

        return $this->redirectToRoute('xxx');
    }

    return [
        'user' => $user,
        'form' => $form->createView(),
    ];
}

こんな感じですかね。

まとめ

  • Symfonyで「現在のパスワード」と「新しいパスワード」を入力させてユーザーのパスワードを変更するフォームを作るときは、UserPassword Constraintsを使えばすごく簡単に作れる
GitHubで編集を提案

Discussion