带有Symfony的JQuery Ajax

I'm trying to create a game with symfony in which there are warriors. Each warrior has a level. To understand jquery and ajax which i'm new with, i want to create a simple button which when clicked use jquery ajax to get the warrior id and make him lvl up. Here is the level up method controller :

public function warriorLevelUpAction(Warrior $warrior){
    $warrior->levelUp();
    return $this->render('StormbladesWarriorBundle:Warrior:homepage.html.twig', array(
        'warrior' => $warrior
    ));
}

Here is my Jquery ajax method

$('#cpt').click(function() {
    $.ajax({
        url: "/stormblades/web/app_dev.php/warriors/levelUp/"+{{ warrior.id }},
        error: function(xhr, error){
            console.debug(xhr);
            console.debug(error);
        }
    });

And here is my routing :

stormblades_warrior_leveluppage:
path:     /warriors/levelUp/{id}
defaults: { _controller: StormbladesWarriorBundle:Warrior:warriorLevelUp }
requirements:
    id: \d+

Obviously, this doesn't work, i got a beautiful error 500. Any help and suggestion on what's wrong would be appreciate.

A couple of things stand out to me.

Firstly, your warriorLevelUpAction function requires a warrior object, but in the request you are only passing an id. Therefore, you require an extra step to get the warrior by it's ID then level up. For example:

public function warriorLevelUpAction($id){
    $warrior = $this->getDoctrine()
    ->getRepository('StormbladesWarriorBundle:Warrior')
    ->find($id);
    $warrior->levelUp();
    return $this->render('StormbladesWarriorBundle:Warrior:homepage.html.twig', array(
        'warrior' => $warrior
    ));
}

Secondly, if you are only ever going to call this function through AJAX, then you could just return a HTTP 200 Status OK, rather then render homepage.html.twig. You don't have to but, I just find it more efficient. Something like this should be fine:

$response = new Response(Response::HTTP_OK);
return $response;

Lastly, in your AJAX code, the url should be: "/warriors/levelUp/"+{{ warrior.id }}, unless there is a specific reson you are using the full path. This path will work in both development and production, whereas your current code will always run in Debug Mode.

everything said above +....

  • allow POST in your route through the method : POST attribute like this ( probably the reason of the 500)
defaults : ......
requirements:
   _method: POST
  • As jrmck said , in your controller, either return a Reponse object or
return  $this->container->get('templating')->renderResponse('..:page.html.twig',
    array( 'var' => $var  ));

url: "{{ path('my_route_php")}}",