2011-11-07 26 views
7

我的驗證看起來像我失去了一個錯誤的聯想到窗體域的Symfony2

Acme\UserBundle\Entity\User: 
    constraints: 
     - \Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity: { fields:username, message: "Username already in use" } 
     - \Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity: { fields:email, message: "Email address already in use" } 
    properties: 
     username: 
      - NotBlank: ~ 
      - MinLength: { limit: 2, message: "Your username must have at least {{ limit }} characters." } 
     email: 
      - Email: 
       message: The email "{{ value }}" is not a valid email. 
       checkMX: true 

我喜歡控制器:

$form = $this->createForm(new RegistrationType()); 
$form->bindRequest($request); 
if ($form->isValid()) { 
    //... save to db 
}else{ 
    $errors = $form->getErrors(); 
    //... pass the errors back as json 
} 

我試圖建立一個用戶註冊控制器通過ajax請求提交。然而,當驗證錯誤被觸發,$error變量的樣子:

[2011-11-07 19:19:44] app.INFO: array (
    0 => 
    Symfony\Component\Form\FormError::__set_state(array(
    'messageTemplate' => 'Email address already in use', 
    'messageParameters' => 
    array (
    ), 
)), 
    1 => 
    Symfony\Component\Form\FormError::__set_state(array(
    'messageTemplate' => 'Your username must have at least {{ limit }} characters.', 
    'messageParameters' => 
    array (
     '{{ value }}' => '1', 
     '{{ limit }}' => 2, 
    ), 
)), 
) [] [] 

的問題是我不知道哪場是錯誤對應。有什麼方法可以找到這些數據,以便當我發送json響應時,我可以將錯誤消息與相關字段相關聯。

回答

6

我認爲,你可以單獨查詢每個字段例如:

$form->get('username')->getErrors()

所以,你可以建立一個數組方式:

$errors['username'] = $form->get('username')->getErrors(); 
$errors['email'] = $form->get('email')->getErrors(); 

您可以到,雖然自動化的東西:

$fields = $form->getChildren(); 
foreach ($fields as $field) { 
    $errors[$field->getName()] = $field->getErrors(); 
} 

我認爲getName函數在自身形式的子對象上調用時應返回字段名稱。別人可能有更高效的方式,雖然...

+0

使用'''$形式 - > getErrors()'''返回錯誤,但是'''$ form-> get('username') - > getErrors()'''即使提交了相同的數據也不會返回錯誤。就好像錯誤與一般形式相關聯,而不是與每個字段相關聯。 – ed209

+0

你在任何地方啓用了error_bubbling嗎? – Kasheen

+0

是的,例如$'builder-> add('username','text',array('error_bubbling'=> true));''' – ed209

3

我認爲接受的答案已經過時,沒有getChildren()方法了。

$errors = []; 
foreach ($form->all() as $field) { 
    if ($field->getErrors()->count() > 0) { 
     $fieldName = $field->getName(); 
     $errors[$fieldName] = []; 
     foreach ($field->getErrors() as $error) { 
      $errors[$fieldName][] = $error->getMessage(); 
     } 
    } 
} 

最後,如果你想訪問從產生FormView表單字段這會給你充分的輸入字段名稱:

$errors = []; 
foreach ($form->createView()->children as $field) { 
    if ($field->vars['errors']->count() > 0) { 
     $fieldName = $field->vars['full_name']; 
     $errors[$fieldName] = []; 
     foreach ($field->vars['errors'] as $error) { 
      $errors[$fieldName][] = $error->getMessage(); 
     } 
    } 
} 
相關問題