3 votes

Symfony3 envoie une demande POST AJAX

Je veux envoyer deux variables id y commentaire par le biais d'un AJAX POST demande . Le problème est que je n'obtiens pas la variable POST mais que la route est atteinte.

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

L'erreur :

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

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

Encore une erreur Symfony :

GET Parameters

Key/Value

commentary/MyCommentary

id/61

Et le routage est nécessaire :

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

2voto

Matteo Points 24881

Essayez d'utiliser la requête passée à l'action du contrôleur au lieu de la récupérer dans le conteneur. Essayez donc ceci :

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

au lieu de ça :

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 :

Vous pouvez restreindre votre routage avec Itinéraire personnalisé en fonction des conditions L'exemple de votre cas est le suivant :

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

UPDATE :

Il y a une erreur de frappe dans la génération du routage du côté JS :

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

vous passez les données comme argument de la fonction routing.generate pour qu'elle concatène les paramètres comme chaîne de requête. essayez donc ceci :

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

Un autre conseil est d'utiliser l'objet $request pour obtenir les données au lieu de l'attribut superglobal de PHP, donc utiliser :

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

au lieu de :

 $_POST['commentary']

Plus d'informations ici dans le doc .

J'espère que cela vous aidera

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X