2013-06-30 30 views
3

我有一個聯繫表單,我使用FormTypes和一個validation.yml進行呈現。提交的表單通過POST和AJAX發送到控制器操作。問題是$form->isValid()總是返回false,雖然我在窗體中輸入了正確的數據。如果我刪除了validation.yml,它仍然返回false。那麼表單的驗證從哪裏獲取數據呢?爲什麼它總是返回錯誤?

這裏是動作控制器:

public function contactAction() 
{ 
    $true = new Response(json_encode(true), 200); 
    $false = new Response(json_encode(false), 500); 

    $form = $this->createForm(new ContactType(), new Contact()); 
    $request = $this->getRequest(); 

    if($request->isMethod('POST') && $request->isXmlHttpRequest()){ 
     $form->bind($request); 

     if($form->isValid()){ 
      // email here 
      error_log('email worked'); 
      return $true; 
     } 
    } 
    error_log('email not worked'); 
    return $false; 
} 

的validation.yml:

Namespace\XYBundle\Entity\Contact: 
properties: 
    name: 
     - NotBlank: ~ 
     - Length: 
      min: 2 
      max: 20 
    email: 
     - NotBlank: ~ 
     - Email: ~ 
    message: 
     - NotBlank: ~ 
     - Length: 
      min: 10 
      max: 10000 

這裏的Ajax調用了jQuery/JS代碼:

$.ajax({ 
      type: "post", 
      url: "contact", 
      data: "name=" + name + "&email=" + email + "&message=" + message, 
      error: function() { 
       $('.error').remove(); 
       $('#sendError').slideDown('slow'); 
       $('button').removeAttr("disabled"); 
       $('button').css("color", "#333333"); 
      }, 
      success: function() { 
       $('.error').remove(); 
       $('#success').slideDown('slow'); 
       $("input[name='contact[name]']").val(''); 
       $("input[name='contact[email]']").val(''); 
       $("textarea[name='contact[message]']").val(''); 
       $('button').removeAttr("disabled"); 
       $('button').css("color", "#333333"); 
      } 
     }); 
+0

如果要發送一個JSON回來,你可以使用JsonResponse響應,而不是http://api.symfony.com/2.1/Symfony/Component/HttpFoundation/JsonResponse.html – Kris

回答

5

既然你手動傳入數據時,您忘記傳入CSRF令牌字段(_token),其中i使其始終無效。

我建議做 data: $('#myForm').serialize(),以確保所有字段都被送到

3

不要建立在你自己的表單數據。主CRSF令牌丟失。 JQuery有一個很好的表單序列化器。

$.ajax({ 
     type: "post", 
     url: "contact", 
     data: $('#yourFormId').serialize(), 
     // ... 
    }); 

Btw。另外兩個tipps。使用HTTP狀態碼403錯誤請求返回錯誤在這種情況下更合適。應該調用JQuerys錯誤函數的所有內容!= 200.

對於記錄monolog是件好事。

$this->get('logger')->error('email foo bar'); 
+0

THX爲進一步提示。另一個人的答案更快,但我贊成你。你能告訴我在哪裏可以找到日誌消息嗎?你的symfony項目的'app/logs'文件夾中的 – tester

+1

是日誌文件。使用的日誌文件取決於您的環境。 –

相關問題