2017-04-06 8 views
1

私は、以下の問題を解決するための最善の(または単なる働く)方法を探しています。 私は何非標準であることUserRepeatedPasswordType、それはこのエンティティへのネストされたフォーム/マッピングフィールド

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add(
      'password', 
      Type\RepeatedType::class, 
      [ 
       'type' => Type\PasswordType::class, 
       'required' => true, 
       'first_options' => [ 
        'label' => 'Password' 
       ], 
       'second_options' => [ 
        'label' => 'Repeat Password' 
       ], 
      ] 
     ); 
} 

のように見え、これら二つのフィールドがpasswordReset形とuserSettingsでも使用されているので、私はそれを作成したことで、標準のUserTypeフォーム

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add(
      'username', 
      Type\TextType::class 
     ) 
     ->add(
      'email', 
      Type\EmailType::class 
     ) 
     ->add(
      'plainPassword', 
      Security\UserRepeatedPasswordType::class 
     ) 
     ->add(
      'roles', 
      Type\ChoiceType::class, 
      [ 
       'multiple' => true, 
       'expanded' => true, 
       'choices' => $this->getRoleChoices() 
      ] 
     ); 
} 

のように持っています形。

1)この方法で使用するとUserエンティティの値が正しくマッピングされません - 文字列が期待されていますが、配列があるというエラーがあります。私はView and Model変圧器を使ってみましたが、適切な結果は得られませんでした(しかし、私はあまり経験がありませんので、そうかもしれません)。私もgetParent()で試してみましたが、そこにはUserTypeを渡しましたが、無限ループになり500となってしまいました。UserRepeatedPasswordTypeからUserTypeに貼り付けフィールドをコピーするだけで正しく動作します。

2)これは解決(あるいはコピーペーストにより、他の方法で行うことができない場合)、別の関連(私は信じている)問題があるされている場合:

私はこのChangePasswordTypeフォームを、持っていますあなたのパスワードをリセットするために使用されます。

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add(
      'confirmationToken', 
      Type\HiddenType::class, 
      [ 
       'required' => true, 
       'constraints' => [ 
        new NotBlank(), 
       ] 
      ] 
     ) 
     ->add(
      'plainPassword', 
      Type\RepeatedType::class, 
      [ 
       'type' => Type\PasswordType::class, 
       'required' => true, 
       'first_options' => [ 
        'label' => 'Password' 
       ], 
       'second_options' => [ 
        'label' => 'Repeat Password' 
       ], 
      ] 
     ) 
     ->add(
      'changePassword', 
      Type\SubmitType::class 
     ); 
} 

そして、それがあるとして、それは正常に動作しますが、私はそれで二つのことをしたい - まず、私の最初の問題を解決し、それにUserRepeatedPasswordTypeを使用し、二 - 私はいくつかのAssert\Length$plainPasswordUserエンティティで行われてきたし、それUserTypeフォームを使用して新しいユーザーを送信すると正しく動作します。しかし、そのバリデーションをChangePasswordTypeにマッピングするか、理想的にはUserRepeatedPasswordTypeにマッピングしたいと思います。すべてのルールを1か所にまとめたいだけです。これもできますか?任意のソリューション/ヒント/アドバイスありがとう。

答えて

0

誰かが興味を持っていれば、私はこれをどうやって完成したのか分かりません。誰もがより良い答えを持っている場合は、単に(主に最初の1に)私の印を与える;)

1)私は(UserTypeでないUserRepeatedPasswordType

$builder->get('plainPassword') 
    ->addViewTransformer(new CallbackTransformer(
     function ($singleAsArray) { 
      return $singleAsArray; 
     }, 
     function ($arrayAsSingle) { 
      return $arrayAsSingle['password'] ?? ''; 
     } 
    )); 
にViewTransformerではなく、親フォームで解決し、思った通り

2)それは実際にはとても簡単でした。そのフォームをUserTypeと同じ方法でUserEntityにマップし、カスタム検証グループを作成して、すべてが素敵でコントロール下にあるようにするだけです。

関連する問題