Intereting Posts
MYSQLI – WHERE IN array Возможно ли перемотать результат PDO? Легкий вопрос о том, как писать мои записи в виде массива PHP Неустранимая ошибка: вызов неопределенной функции openssl_random_pseudo_bytes () Угловые скобки в строке PHP Предупреждение: file_get_contents не удалось открыть поток: время ожидания подключения включает / simple_html_dom.php в строке 75 Конфигурирование Eclipse для добавления папки для создания пути вне рабочей области PHP-массив Кодирование и декодирование: нужна функция для кодирования и декодирования строки или массива с разделителями или массивом передача нескольких параметров с помощью $ .ajax по POST в php-функцию Поля обновления MongoDB во вложенном массиве Исправить пути перезаписи файла .htaccess для silex? PHP – длина строки, содержащей emojis / специальные символы как обрабатывать символ горизонтальной эллипсис (три точки) в XML-выходе через PHP Laravel 3: Ищите объяснение, как использовать модель обновить данные в div

Как сделать запрос 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 не возвращает никакого значения …

Это правильный способ сделать это?

EDIT: похоже, что контроллер не может обрабатывать запрос 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?) 

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

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

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

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;

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