2017-10-13 2 views
0

私は、別のユーザーボタンの追加をクリックして複数のユーザー情報を追加できるフィールドを持つフォームを持っています。Symfony検証コンポーネント多次元フォームデータ

サーバー側では、必要に応じてすべてのファーストネームとラストネームを検証する必要があります。

私の問題は、fnameやlnameのようなデータの繰り返しを検証する方法はわかりません。

$stripToken = $request->request->get('stripeToken'); 

     $input = $request->request->all(); 
     var_dump($input); 
     try { 
      $constraint = new Assert\Collection(array(
       'fields' => array(
        'guest_fname' => new Assert\All(array(
         'constraints' => array(
          new Assert\NotBlank(), 
          new Assert\MinLength(array('limit' => 2)) 
         ) 
        )), 
        'guest_lname' => new Assert\All(array(
         'constraints' => array(
          new Assert\NotBlank(), 
          new Assert\MinLength(array('limit' => 2)) 
         ) 
        )) 
       ), 
       'allowMissingFields' => true, 
      )); 
     }catch (\Exception $e) { 
      return $e->getMessage(); 
     } 

     $errors = $this->app['validator']->validate($input, $constraint); 

このコードは、入力のworking.Theのvar_dumpはAssert\All()はあなたのケースで十分だろうしながら、あなたはAssert\Collection()Assert\All()をラップしている

array(6) { 
    ["guest_fname"]=> 
    array(3) { 
    [0]=> 
    string(3) "asdd" 
    [1]=> 
    string(6) "asdasd" 
    [2]=> 
    string(9) "asdasdasd" 
    } 
    ["guest_lname"]=> 
    array(3) { 
    [0]=> 
    string(6) "asdasd" 
    [1]=> 
    string(6) "asdasd" 
    [2]=> 
    string(9) "asdasdasd" 
    } 
    ["guest_email"]=> 
    array(1) { 
    [0]=> 
    string(0) "" 
    } 
    ["guest_phone"]=> 
    array(1) { 
    [0]=> 
    string(0) "" 
    } 
    ["guest_count"]=> 
    string(1) "1" 
    ["stripeToken"]=> 
    string(28) "tok_234234234234234" 
} 
+0

* FormType(実際にフォームビルダーにフィールドを追加する部分)の関連部分を質問に追加できますか? – nifr

+0

@nifr質問を更新しました。私はFormTypeを使用していません。 –

答えて

0

は、新しいバージョンの判明コンポーネントのアサートオプションリストにはMinLengthオプションがありません。代わりに、長さがオプションです。これを修正する制約コードは次のとおりです。

$constraint = new Assert\Collection(array(
       'fields' => array(
        'guest_fname' => new Assert\All(array(
         'constraints' => array(
          new Assert\NotBlank(), 
          new Assert\Length(array(
           'min' => 3, 
           'minMessage' => 'Your name must have at least {{ limit }} characters.', 
          )) 
         ) 
        )), 
        'guest_lname' => new Assert\All(array(
         'constraints' => array(
          new Assert\NotBlank(), 
          new Assert\Length(array(
           'min' => 3, 
           'minMessage' => 'Your name must have at least {{ limit }} characters.', 
          )) 
         ) 
        )) 
       ), 
       'allowMissingFields' => true 
      )); 

残りのコードは問題ありません。

0

を返していません。

$inputではないコレクション(イテラブル)ではなく、キーと値のペアを持つ配列です。それ自身の各キーを検証するだけです。

$constraint = new Assert\All(array(
    'constraints' => array(
     new Assert\NotBlank(), 
     new Assert\Length(array('min' => 5)), 
    ), 
); 
$errors = $this->app['validator']->validate($input['guest_fname'], $constraint); 

...かはバリにそれを渡すときに反復可能(すなわち配列)と$inputをラップし、あなたのラッピングAssert\Collection()を使用して保つことができる:

$errors = $this->app['validator']->validate(array($input), $constraint);