2016-05-17 42 views
1

为了构建我的新网站,我决定尝试Silex框架。我在文档中阅读了很多内容,所以直到现在我都没有问题。如何在Silex中使用Ajax查询?

我正在制作一个投票系统,我想用Ajax动态地使用它。

所以,首先我声明了路线:

routes.php文件

$app->match('/ajax/vote', mysite\Controller\HomeController::voteAction'); 

我注册的服务:

app.php

$app['dao.ajax'] = $app->share(function ($app) { 
    return new mysite\DAO\AjaxDAO($app['db']); 
}); 

然后,有相关的控制器:

HomeController.php

public function voteAction(Application $app, Request $request) {   

    $vote = new Vote(); 
    $vote->setVoteId($request->get('vote_id')); 
    $vote->setBookId($request->get('book_id')); 
    $vote->setVoterIp($request->get('IP')); 

    $voteAction = $app['dao.ajax']->saveVote($vote); 
    return $app['twig']->render('index.html.twig'); 
} 

所以,当我点击投票按钮,它应该是(重新)渲染的索引页。

我的DAO类:

DAO.php

namespace mysite\DAO; 

use Doctrine\DBAL\Connection; 

abstract class DAO 
{ 
    private $db; 

    public function __construct(Connection $db) { 
     $this->db = $db; 
    } 

    protected function getDb() { 
     return $this->db; 
    } 

    protected abstract function buildDomainObject($row); 
} 

然后,表决功能:

AjaxDAO.php

namespace mysite\DAO; 

use mysite\Domain\Vote; 

class AjaxDAO extends DAO 
{ 
    protected function buildDomainObject($row) { 
     $vote = new Vote(); 
     $vote->setVoteId($row['vote_id']); 
     $vote->setBookId($row['book_id']); 
     $vote->setVoterIp($row['vt_ip']); 
     return $vote; 
    } 

    public function saveVote(Vote $vote) { 

     $voteData = array(
      'vote_id' => $vote->getVoteId(), 
      'book_id' => $vote->getBookId(), 
      'vt_ip' => $vote->getVoterIp() 
     ); 
     $this->getDb()->insert('t_vote', $voteData); 
    } 
} 

表决类:

Vote.php

namespace mysite\Domain; 

class Vote 
{ 
    private $id; 

    private $vote_id; 

    private $book_id; 

    private $vt_ip; 


    public function getId() { 
     return $this->id; 
    } 

    public function setId($id) { 
     $this->id = $id; 
    } 

    public function getVoteId() { 
     return $this->vote_id; 
    } 

    public function setVoteId($vote_id) { 
     $this->vote_id = $vote_id; 
    } 

    public function getBookId() { 
     return $this->book_id; 
    } 

    public function setBookId($book_id) { 
     $this->book_id = $book_id; 
    } 

    public function getVoterIp() { 
     return $this->vt_ip; 
    } 

    public function setVoterIp($vt_ip) { 
     $this->vt_ip = $vt_ip; 
    } 
} 

现在,随着Ajax的jQuery的它:

vote.js

$('button').on('click', function like(e) { 
    $(this).off('click'); 
    e.preventDefault(); 

    var vote_id = '{{ vote_id }}'; 
    var book_id = $(this).attr('data-book'); 
    var IP = '{{ getUserIp() }}'; 

    if ($(this).hasClass('active')) { 
     $.ajax({ 
      type: 'POST', 
      url: '/ajax/vote', 
      data: {'POST_type': 'vote', 'book_id': book_id, 'IP': IP}, 
      success: function(html) { 
       $('button').removeClass('active').addClass('disabled'); 
      }, 
      error: function() { 
       alert('error'); 
      } 
     }); 
    }; 
}); 

正如你可能已经明白了,当我点击按钮VOTE,我有一个错误提醒。当我访问链接的mysite/AJAX /票,我有这样的错误:

Notice: Undefined property: mysite\DAO\AjaxDAO::$request 

我在官方文件和先前StackOverflow的问题,检查,但我发现只有question 22011254并没有帮助我。 ..

编辑:我刚刚读到,Silex只支持与Ajax的Json数据交换。也许这是问题吗?

回答

1

AjaxDAO.php方法saveVote有错误。您尝试使用此类中未定义的属性$this->request。更好地设置控制器中的投票字段,并将其传输到saveVote

HomeController.php

public function voteAction(Application $app, Request $request) { 
    ... 

    $vote = new Vote(); 
    $vote->setVoteId($request->get('vote_id')); 
    $vote->setBookId($request->get('book_id')); 
    $vote->setVoterIp($request->get('vt_ip')); 

    $voteAction = $app['dao.ajax']->saveVote($vote); 

    ... 
} 

AjaxDAO.php

public function saveVote(Vote $vote) { 
    $voteData = array(
     'vote_id' => $vote->getVoteId(), 
     ... 
    ); 
    $this->getDb()->insert('t_vote', $voteData); 
} 
+0

谢谢你的回答,但现在,我的错误是:'注意:未定义的属性:mysite \ Controller \ HomeController :: $ request' – cyclone200

+0

'$ request',而不是'$ this-> request',我改变了我的答案 –

+0

我用你的答案编辑我的代码,我仍然有一个错误:'执行'INSERT INTO t_vote(musite \ Domain \ Voteid,mysite \ Domain \ Votevote_id,mysite \ Domain \ Votebook_id,mysite \ Domain \ Votevt_ip)VALUES(?,?,?,?)'with params [null,null,null,null]:' ...我在AjaxDAO中使用了'(array)',因为当我想插入$ data时期待一个阵列,它是一个对象。 – cyclone200

0

我没有使用Silex的,我也不是熟悉的,但观看documentation

您可以为大多数HTTP方法创建控制器。只需在您的应用程序中调用以下方法之一:获取,发布,放置,删除,修补程序。

在你的HomeController.php中使用get(),不应该在Ajax中使用这个HTTP方法吗?

$('button').on('click', function like(e) { 
    $(this).off('click'); 
    e.preventDefault(); 

    var vote_id = 'Vote ID'; 
    var book_id = $(this).attr('data-book'); 
    var IP = getUserIp(); 

    if ($(this).hasClass('active')) { 
     $.ajax({ 
      type: 'GET', 
      url: '/ajax/vote?vote_id='+vote_id+'&book_id='+book_id+'vt_ip='+IP, 
      success: function(html) { 
       $('button').removeClass('active').addClass('disabled'); 
      }, 
      error: function() { 
       alert('error'); 
      } 
     }); 
    }; 
}); 
2

这是值得一试的是与你的Ajax请求发送的头。在silex application/json请求不作为标准x-form处理。您可以使用silex cookbook中提及的解决方案来解决此问题(此操作适用于2. *和1.3。*)。

至于通知我开始看这里:

$vote->setVoteId($request->get('vote_id')); 
$vote->setBookId($request->get('book_id')); 
$vote->setVoterIp($request->get('IP')); 

如果你正在做一些不规范的POST请求也许那些$request->get方法调用返回其他的东西比你预期(如请求对象?) 。既然你没有验证或禁令,你可能没有注意到。

你也可以改变这一点:

$app->match('/ajax/vote', mysite\Controller\HomeController::voteAction'); 

到:没有特定的方法

$app->post('/ajax/vote', mysite\Controller\HomeController::voteAction'); 

因为match将每一个类型的请求相匹配。现在可能无关紧要,但会在以后节省您的麻烦。