如何使用Symfony和Jquery提出POST Ajax请求

2022-08-30 22:10:02

我需要在我的symfony项目中存储一些map参数,为此,我需要在我的视图中实现一些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);
        }
    });

});

我检查它确实存在的网址,并按预期返回“这不是Ajax”。但是控制台.log不返回任何值...recherche/ajax

这是正确的方法吗?

编辑:看起来控制器无法处理 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/xmlResponse

附言:不要忘记为 和 添加使用语句RequestJsonResponse

编辑:正如您添加的错误消息所说,您需要使用以下命令导入注释:@Method

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;


答案 2

我正在查看整个互联网,没有找到类似问题的任何解决方案。但是我发现它>我既没有控制器的问题,也没有javascript / jquery / ajax或安全问题。它是在....等一下....在 HTML 中。我不得不将type=“button”添加到html标签中,否则整个页面都会刷新。在调试目的上浪费了4个小时。但吸取了教训。

如何调试问题?1. 检查ajax是否在客户端发送帖子和匹配的post路由。火狐 -> f12 -> 网络 ->观看 POST 事件 2.检查 -> /app_dev.php/ (dev enviroment) 上的 symfony profiler (非常有用的工具!) -> 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> 

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 目录中创建新文件。如果它已匹配并创建了文件,则表示您匹配了路由,但未收到响应