2016-04-18 4 views
3

Я хочу отправить две переменные идентификатор и комментарий через AJAX POST запроса. Проблема в том, что я не получаю переменную POST, но маршрут достигнут.Symfony3 отправить запрос AJAX 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 

ответ

2

Попробуйте использовать запрос, переданный в Action Controller вместо извлечения его из контейнера. Так что попробуйте это:

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(); 

UPDATE:

Вы можете ограничить маршрутизацию с Customized Route Matching with Conditions, в качестве примера на вашем случае следующим образом:

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

UP ДАТА:

Существует опечатка в поколение маршрутизации в сторону 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"); 

Еще один совет о том, чтобы использовать $ объект запроса для получения данных вместо суперглобального атрибута PHP, так что используйте:

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

вместо:

$_POST['commentary'] 

Дополнительная информация here in the doc.

Надеюсь, эта помощь

+0

Ну, это сработало с условием isAjax. Но я до сих пор не могу получить доступ к переменным $ _POST. На самом деле я узнал, что они отправляются как переменная Get, а не почта, и если я смотрю на $ _GET ['id'], это работает. Для меня это еще не исправлено. –

+1

Привет @ValentinBEAULE жаль, что я не видел, как вы получаете доступ к данным запроса.В symfony предпочтительнее использовать [this] (http://symfony.com/doc/current/book/http_fundamentals.html#requests-and-responses-in-symfony) подход, поэтому не используйте суперглобальные переменные. – Matteo

+0

@ValentinBEAULE вы генерируете неправильный маршрут и вместо этого помещаете данные в маршрут, а не передаете третьим аргументам функции jquery post – Matteo

Смежные вопросы