Как сделать запрос POST Ajax с помощью Symfony и JQuery

Мне нужно сохранить некоторый параметр карты в моем проекте 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, он существует и возвращает "Это не 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

Попробуйте это,

/**                                                                                   
 * @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: Не забудьте добавить параметр использования для Request и JsonResponse

EDIT: В появившемся сообщении об ошибке вам нужно импортировать аннотацию @Method, используя:

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;

Ответ 2

Я смотрел весь интернет и не нашел решения подобной проблемы. Но я нашел это → У меня не было проблем с контроллером, ни с javascript/jquery/ajax, ни с проблемами безопасности. Это было... дожидаться этого.... в HTML. я должен был добавить type = "button" в тег html, иначе целая страница была освежающей. 4 часа потрачены впустую на цели отладки.. но извлеченные уроки.

Как отлаживать проблемы?  1. Проверьте, отправляет ли ajax сообщение и соответствующий почтовый маршрут на стороне клиента. Firefox → f12 → network → смотреть события POST  2. Проверьте профилировщик symfony (очень полезный инструмент!) В конце подменю → /app_dev.php/(dev enviroment) → Get Request/Response принять последние 10, если вы увидите, что маршрут POST проверяет внимательно, если его код возврата и параметры (вы не увидите ответ, если его набор отличается от ответа HTML)  3. В контроллере выполните некоторые действия, которые можно проверить, если script внутри этого маршрута был выполнен. Если это так, и вы не видите ответа либо на стороне сервера (контроллера), либо на стороне клиента (twig/ajax/html)  4. Примеры кода:

Кнопка в html (это была моя проблема)

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

Ajax в 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 создать новый файл в веб-каталоге. Если он был сопоставлен и создается файл, это означает, что вы сопоставили маршрут, но не получили ответ