web-dev-qa-db-ja.com

SymfonyとJqueryでPOST Ajaxリクエストを行う方法

私のsymfonyプロジェクトにいくつかのマップパラメーターを保存する必要があります。これを行うには、いくつかの情報をコントローラーに渡すことができるビューに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存在し、期待どおり 'This is not 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?) 
14
Xavier

これを試して、

/**                                                                                   
 * @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リクエストを送信する場合、Responseオブジェクト全体ではなく、json/plaintext/xmlデータを返す必要があります。

PS:RequestおよびJsonResponseの使用ステートメントを追加することを忘れないでください

EDIT:追加したエラーメッセージにあるように、次を使用して@Methodアノテーションをインポートする必要があります。

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;

23
sf_tristanb

私はインターネット全体を見ていましたが、同様の問題の解決策は見つかりませんでした。しかし、私はそれを発見しました->私はコントローラの問題もjavascript/jquery/ajaxもセキュリティの問題もありませんでした。それは....待って.... HTMLにありました。 type = "button"をhtmlタグに追加する必要がありました。そうしないと、ページ全体が更新されていました。デバッグ目的で4時間は無駄になりましたが、教訓は得られました。

問題をデバッグする方法は? 1. ajaxがクライアント側でポストと一致するポストルートを送信しているかどうかを確認します。 Firefox-> f12->ネットワーク-> POST events 2.を監視します。2.-> /app_dev.php/(dev環境)-> Getでsymfonyプロファイラ(非常に便利なツール!)を確認しますPOSTルートがリターンコードとパラメータであるかをルートチェックで確認した場合(HTMLレスポンス以外に設定した場合、レスポンスが表示されない場合)コントローラは、このルート内のスクリプトが実行されたかどうかを確認できるアクションを実行します。実行された場合、サーバー側(コントローラ)またはクライアント側(twig/ajax/html)で応答がありません。4。コード例:

HTMLのボタン(これは私の問題でした)

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

HTMLまたはその他のインクルードjsファイルのAjax:

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ディレクトリに新しいファイルを作成します。一致し、ファイルが作成された場合、つまり、ルートは一致しましたが、応答がありませんでした

2