gpt4 book ai didi

php - 如何将 Ajax 查询与 Silex 结合使用?

转载 作者:行者123 更新时间:2023-12-01 07:46:15 26 4
gpt4 key购买 nike

为了构建我的新网站,我决定尝试 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']);
});

然后,有关联的 Controller :

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

投票类:

投票.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');
}
});
};
});

正如您可能已经了解的那样,当我单击“投票”按钮时,我收到了错误警报。当我访问链接 mysite/ajax/vote 时,出现此错误:

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

我查看了官方文档和之前的 StackOverflow 问题,但我只找到了 question 22011254这对我没有帮助...

编辑:我刚刚读到 Silex 仅支持与 Ajax 的 Json 数据交换。也许这就是问题所在?

最佳答案

值得检查一下与 ajax 请求一起发送的 header 中的内容。在 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'));

如果您发出一些非标准的发布请求,那么这些 $request->get 方法调用可能会返回您期望之外的内容(例如请求对象?)。由于您没有进行验证或清理,您可能没有注意到。

您还可以更改此设置:

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

至:

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

因为没有指定方法的 match 将匹配每种类型的请求。现在可能不重要,但以后会省去你的麻烦。

关于php - 如何将 Ajax 查询与 Silex 结合使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37284580/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com