0

私はsymfony2で簡単な登録フォームを練習しています。私は、plainPassword フィールドと埋め込まれた User ドキュメント (私は mongoDB を使用しています) と 2 つの FormTypes を持つ Register モデルを作成しました。ユーザー ドキュメントには、パスワード フィールドに NotBlank の制約があります。

Register モデルから plainPassword を読み取り、それをハッシュして User ドキュメントに設定したいと考えています。これは、ハッシュする前に最大/最小の長さを検証するためのものです。

問題は、フォームをバインドすると、Symony が User.password フィールドが空白のエラー配列を既に保存しているように見えることです。そのため、バインディング後にハッシュ化されたパスを設定しても、フォームは決して有効ではありません。「この値は空白にしないでください」というメッセージが常に表示されます

最後に、User.password から NotBlank 制約を削除すると、「バインドされていないフォームで isValid() を呼び出すことはできません」という結果になります。いずれにせよ、制約を削除したくありませんが、少なくともそれが機能することを確認したかったのです。

いくつかのコード:

class RegisterController extends Controller {

/**
 * @Route("/register/", name="register_new")
 * @Template()
 */
public function indexAction(Request $request)
{
    $form = $this->createForm(new RegistrationType(), new Registration());

    if ($request->getMethod() == 'POST') {
        $form->bindRequest($request);
        $register = $form->getData();
        $user = $register->getUser();
        $user->setPassword(sha1($register->getPlainPassword()));
        $form->setData($register);
        if ($form->isValid()) {
            return $this->redirect($this->generateUrl('login_form'));
        } 
    }
    return array('form' => $form->createView());
}

}
4

1 に答える 1

2

この問題を解決するには、少なくとも 2 つの方法があります。

  • NotBlankフィールドから制約を削除しpasswordます。ここでの理由は、ユーザーがエンコードされたパスワードを設定できないようにするため、実際に検証する必要がないからです。

    ところで、制約を削除した後に発生するエラーは、制約を削除したという事実ではなく、他の何かが原因です。

  • 検証グループを使用します。passwordフィールドを別の場所 (サービス層など) で検証できるようにしたい場合は、検証グループを作成passwordし、登録に使用しているグループからフィールドの制約を除外します。

于 2012-04-11T07:00:24.407 に答える