Symfony3发送AJAX POST请求

时间:2016-04-18 08:20:13

标签: javascript php ajax symfony

我想通过 AJAX POST发送两个变量 id 评论 请求。 问题是我没有得到POST变量但是到达了路线。

JS:

$.post(Routing.generate('ajax_savecommentary', { id:id, commentary:commentary }), 
function(response)
{
}, "json");

Symfony的:

public function saveCommentaryAction()
{
    if (!$this->get('session')->get('compte'))
        return $this->redirect($this->generateUrl('accueil'));

    $request = $this->container->get('request_stack')->getCurrentRequest();
    $isAjax = $request->isXMLHttpRequest();

    if ($isAjax)
    {
        $information = $this->getDoctrine()->getManager()->getRepository('CommonBundle:Information')->find($_POST['id']);

        $information->setCommentaire(str_replace('\n', '\\n', $_POST['commentary']));
        $this->getDoctrine()->getManager()->flush();

        $response = array("code" => 100, "success" => true, 'commentary' => $_POST['commentary']);
        return new Response(json_encode($response));
    }
    $response = array("code" => 0, "success" => false);
    return new Response(json_encode($response));
}

错误:

  

http://localhost/MyProject/web/app_dev.php/ajax/save/commentary/?id=61&commentary=MyCommentary

{"code":0,"success":false}

更多Symfony错误:

GET Parameters

Key/Value

commentary/MyCommentary

id/61

需要路由:

ajax_savecommentary:
    defaults: { _controller: CommonBundle:Default:saveCommentary }
    path:     /ajax/save/commentary/
    options:
        expose: true

1 个答案:

答案 0 :(得分:2)

尝试使用传递给Controller Action的请求,而不是从容器中检索它。所以试试这个:

use Symfony\Component\HttpFoundation\Request;

...

public function saveCommentaryAction(Request $request)
{
    if (!$this->get('session')->get('compte'))
        return $this->redirect($this->generateUrl('accueil'));

    $isAjax = $request->isXMLHttpRequest();

而不是:

public function saveCommentaryAction()
{
    if (!$this->get('session')->get('compte'))
        return $this->redirect($this->generateUrl('accueil'));

    $request = $this->container->get('request_stack')->getCurrentRequest();
    $isAjax = $request->isXMLHttpRequest();

<强>更新

您可以使用Customized Route Matching with Conditions限制路由,例如您的案例如下:

ajax_savecommentary:
    defaults: { _controller: CommonBundle:Default:saveCommentary }
    path:     /ajax/save/commentary/
    options:
        expose: true
    condition: "request.isXmlHttpRequest()"
    methods:  [POST]

<强>更新

JS方面的路由生成中存在拼写错误:

$.post(Routing.generate('ajax_savecommentary', { id:id, commentary:commentary }), 
function(response)
{
}, "json");

您将数据作为routing.generate函数的参数传递,因此它将params连接为查询字符串。所以试试这个:

$.post(Routing.generate('ajax_savecommentary'), { id:id, commentary:commentary }, 
function(response)
{
}, "json");

另一个建议是使用$ request对象来获取数据而不是超全局PHP属性,所以使用:

$request->request-get('commentary');

而不是:

 $_POST['commentary']

更多信息here in the doc

希望这个帮助