2012-04-11 7 views
0

symfony2で簡単な登録フォームを実践しています。私はplainPasswordフィールドと埋め込まれたUserドキュメント(mongoDBを使用しています)と2つのFormTypeを持つRegisterモデルを作成しました。ユーザー文書では、パスワードフィールドにNotBlankという制約があります。symfony 2でフォームをバインドした後にフィールドを設定する

plainPasswordをRegisterモデルから読み込み、ハッシュして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()); 
} 

} 

答えて

2

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

  • passwordフィールドからNotBlank制約を削除します。ここでは、ユーザーがエンコードされたパスワードを設定することを許可しないため、実際に検証する必要はありません。

    ところで、制約を削除した後に表示されるエラーは、削除したという事実によってではなく、他の何かによって引き起こされます。

  • validation groupsを使用してください。passwordフィールド(service layerなど)を検証できるようにするには、検証グループを作成し、登録用に使用しているグループからpasswordフィールドの制約を除外します。

+0

ありがとうございましたelnur、私はフレームワークのセキュリティドキュメントと検証ドキュメントを読んでいる間、私は単純な方法(NotBlankを削除)に行きました。 – adrianmoya

関連する問題