2013-10-15 107 views
11

我需要在我的symfony項目中存儲一些map參數,爲此我需要在我的視圖中實現一些Ajax,這將能夠將一些信息傳遞給控制器​​。如何使用Symfony和Jquery創建POST Ajax請求

我閱讀文檔,嘗試編寫一些代碼,但我無法使其工作。而Ajax調試非常麻煩。 這裏是控制器部分:

/**                     
* @Route("/ajax", name="_recherche_ajax") 
*/ 
public function ajaxAction()  
{ 
    $isAjax = $this->get('Request')->isXMLHttpRequest(); 
    if ($isAjax) {   
     return new Response('This is ajax response'); 
    } 
    return new Response('This is not ajax!', 400); 
} 

而且JS:

map.on('zoomend', function(e) { 
    // use callback e variable 
    console.log('zoom: ' + e.target.getZoom()); 

    $.ajax({ 
     type: "POST", 
     url: "/recherche/ajax", 
     data: { 
      zoom: e.target.getZoom() 
     }, 
     dataType: "json", 
     success: function(response) { 
      console.log(response); 
     } 
    }); 

}); 

我檢查URL recherche/ajax它確實存在,並返回「這不是阿賈克斯預期。但是console.log沒有返回任何值...

這是正確的方法嗎?

編輯: 它看起來像控制器無法處理POST請求。我試圖修改註釋:

/**                     
* @Route("/ajax", name="_recherche_ajax") 
* @Method({"GET", "POST"}) 
*/ 

但它返回:

([Semantical Error] The annotation "@Method" in method MySite\SiteBundle\Controller\RechercheController::ajaxAction() was never imported. Did you maybe forget to add a "use" statement for this annotation?) 
+1

響應輸出'undefined'或根本沒有輸出? – Touki

+0

我什麼也沒有,我的控制檯... – Xavier

+0

這很可能是由於PHP中的'FATAL'錯誤。嘗試直接在瀏覽器中輸入ajax請求地址(我知道,它不是'POST')並查看是否有一些Symfony錯誤... –

回答

20

試試這個,

/**                     
* @Route("/ajax", name="_recherche_ajax") 
*/ 
public function ajaxAction(Request $request)  
{ 
    if ($request->isXMLHttpRequest()) {   
     return new JsonResponse(array('data' => 'this is a json response')); 
    } 

    return new Response('This is not ajax!', 400); 
} 

在你發送一個Ajax請求的情況下,您需要返回json/plaintext/xml數據,而不是一個整體Response對象。

PS:不要忘記添加使用statment爲RequestJsonResponse

編輯:當你添加的錯誤消息說,您需要使用導入的註釋@Method

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;

+0

嗡嗡聲,仍然沒有 – Xavier

+0

我想從控制器調用實際的ajax調用。 請給出任何建議。 –

+0

您可以將'condition =「request.isXmlHttpRequest(),''添加到'@ Route'以將匹配限制爲ajax請求。類似於@ @ Method的工作方式。請參閱:http://symfony.com/doc/current/routing/conditions.html – fyrye

2

我正在尋找整個互聯網,並沒有找到類似問題的任何解決方案。但我發現它 - > 我沒有問題的控制器,也沒有javascript/jquery/ajax或安全問題。 這是....在HTML中等待它.... 我不得不將type =「button」添加到html標籤中,否則整個頁面都會刷新。 爲了調試目的,浪費了4個小時......但吸取了教訓。

如何調試問題? 1.檢查ajax是否在客戶端發送郵件和匹配郵件路由。 Firefox - > f12 - > network - >觀看POST事件 2.在 - > /app_dev.php/(開發環境) - > Get Request/Response子菜單結束後檢查symfony分析器(非常有用的工具! ,如果你看到POST路由檢查,如果它的返回代碼和參數(你不會看到響應,如果它的設置不是HTML響應) 3.在你的控制器中執行一些可以檢查的動作,如果這個路由中的腳本被執行。如果是這樣,並且您在服務器端(控制器)或客戶端(twig/ajax/html) 4上看到沒有響應。代碼示例:在HTML

按鈕(這是我的問題)

<button name="button" id="button" class="button" type="button" value="100"> Click me </button> 

阿賈克斯HTML或其他包含js文件:

function aButtonPressed(){ 
     $.post('{{path('app_tags_sendresponse')}}', 
      {data1: 'mydata1', data2:'mydata2'}, 
      function(response){ 
       if(response.code === 200 && response.success){ 
        alert('success!'); 
       } 
       else{ 
        alert('something broken'); 
       } 
      }, "json"); 
    } 

現在..服務器端。控制器:

namespace AppBundle\Controller; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
class JsonApiController extends Controller 
    /** 
     * @Route("/api/programmers") 
     * @Method("POST") 
     */ 
     public function sendResponse() 
     { 
      if(isset($_POST['data1'])){ 
       $json = json_encode(array('data' => $_POST['data1']), JSON_UNESCAPED_UNICODE); 
       file_put_contents("test.json", $json); 
       return new JsonResponse($json); 
      } 
      return new Response('didn't set the data1 var.'); 
     } 
    } 

File put contents在web目錄中創建新文件。如果它匹配並且文件被創建,意味着你匹配了路由,但沒有得到響應