如何使用 Silex 进行 Ajax 查询?
How to use Ajax queries with Silex?
为了构建我的新站点,我决定尝试使用 Silex 框架。我在文档中阅读了很多内容,所以直到现在我都没有遇到任何问题。
我正在制作一个投票系统,我想通过 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 class :
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);
}
}
投票 class :
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;
}
}
现在,jQuery 里面有 Ajax :
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');
}
});
};
});
您可能已经了解,当我点击投票按钮时,我收到错误警报。当我访问 link mysite/ajax/vote 时,出现此错误:
Notice: Undefined property: mysite\DAO\AjaxDAO::$request
我查看了官方文档和以前的 Whosebug 问题,但我只找到了 question 22011254,它对我没有帮助...
编辑: 我刚刚读到 Silex 仅支持 Json 与 Ajax 的数据交换。也许是这个问题?
AjaxDAO.php
方法 saveVote
有错误。您尝试使用未在此 class 中定义的 属性 $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);
}
我没有使用过 Silex,我对它不是很熟悉,但正在查看 documentation。
You can create controllers for most HTTP methods. Just call one of these methods on your application: get, post, put, delete, patch.
在你的 HomeController.php 中你使用了 get(),这个 HTTP 方法不应该也在 ajax 中使用吗?
例子
$('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');
}
});
};
});
值得检查 headers 随您的 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'));
如果您正在提出一些 non-standard post 请求,可能那些 $request->get
方法调用 return 与您预期不同的东西(例如请求 object? ).由于您没有进行任何验证或消毒,您可能没有注意到。
你也可以改变这个:
$app->match('/ajax/vote', mysite\Controller\HomeController::voteAction');
至:
$app->post('/ajax/vote', mysite\Controller\HomeController::voteAction');
因为match
没有指定方法将匹配所有类型的请求。现在可能无所谓,但以后会省去你的麻烦。
为了构建我的新站点,我决定尝试使用 Silex 框架。我在文档中阅读了很多内容,所以直到现在我都没有遇到任何问题。
我正在制作一个投票系统,我想通过 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 class :
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);
}
}
投票 class :
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;
}
}
现在,jQuery 里面有 Ajax :
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');
}
});
};
});
您可能已经了解,当我点击投票按钮时,我收到错误警报。当我访问 link mysite/ajax/vote 时,出现此错误:
Notice: Undefined property: mysite\DAO\AjaxDAO::$request
我查看了官方文档和以前的 Whosebug 问题,但我只找到了 question 22011254,它对我没有帮助...
编辑: 我刚刚读到 Silex 仅支持 Json 与 Ajax 的数据交换。也许是这个问题?
AjaxDAO.php
方法 saveVote
有错误。您尝试使用未在此 class 中定义的 属性 $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);
}
我没有使用过 Silex,我对它不是很熟悉,但正在查看 documentation。
You can create controllers for most HTTP methods. Just call one of these methods on your application: get, post, put, delete, patch.
在你的 HomeController.php 中你使用了 get(),这个 HTTP 方法不应该也在 ajax 中使用吗?
例子
$('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');
}
});
};
});
值得检查 headers 随您的 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'));
如果您正在提出一些 non-standard post 请求,可能那些 $request->get
方法调用 return 与您预期不同的东西(例如请求 object? ).由于您没有进行任何验证或消毒,您可能没有注意到。
你也可以改变这个:
$app->match('/ajax/vote', mysite\Controller\HomeController::voteAction');
至:
$app->post('/ajax/vote', mysite\Controller\HomeController::voteAction');
因为match
没有指定方法将匹配所有类型的请求。现在可能无所谓,但以后会省去你的麻烦。