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