2017-10-13 139 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返回

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

你包裹Assert\All()Assert\Collection()Assert\All()就足以在你的情況。

您的$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);