18

我需要在我的 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);
        }
    });

});

我检查它确实存在的 urlrecherche/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?) 
4

2 回答 2

24

尝试这个,

/**                                                                                   
 * @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:不要忘记为Requestand添加 use 语句JsonResponse

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

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;

于 2013-10-15T08:11:59.453 回答
3

我正在寻找整个互联网,但没有找到类似问题的任何解决方案。但是我发现了它-> 控制器、javascript/jquery/ajax 和安全问题都没有问题。它在……等待它……在 HTML 中。我必须将 type="button" 添加到 html 标记中,否则整个页面都在刷新。调试目的浪费了 4 个小时.. 但吸取了教训。

如何调试问题?1.检查ajax是否在客户端发送post和匹配的post路由。Firefox -> f12 -> 网络 -> 观看 POST 事件 2. 检查 -> /app_dev.php/ (开发环境)上的 symfony 分析器(非常有用的工具!) -> 获取请求/响应子菜单结束最后 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 目录中创建新文件。如果匹配并创建了文件,则意味着您匹配了路由,但没有得到响应

于 2017-08-16T13:36:34.203 回答