【问题标题】:How to use Ajax queries with Silex?如何在 Silex 中使用 Ajax 查询?
【发布时间】:2016-05-17 19:19:18
【问题描述】:

为了构建我的新站点,我决定尝试使用 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 课程:

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

您可能已经了解,当我单击按钮 VOTE 时,我会收到错误警报。当我访问链接 mysite/ajax/vote 时,出现此错误:

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

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

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

【问题讨论】:

    标签: php jquery ajax silex


    【解决方案1】:

    值得检查随 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'));
    

    如果您正在发出一些非标准的发布请求,那么这些 $request->get 方法调用可能会返回与您预期不同的东西(例如请求对象?)。由于您没有进行验证或消毒,您可能没有注意到。

    你也可以改变这个:

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

    到:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 感谢您的回答,但现在,我的错误是:Notice: Undefined property: mysite\Controller\HomeController::$request
      • $request,不是$this->request,我改了答案
      • 我用你的答案编辑了我的代码,但我仍然有一个错误:An exception occurred while executing '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 时,它期待一个数组和它是一个对象。
      • 哦,您不使用 orm... 而不是创建包含所有字段和值的数组,这些字段和值应放置在 id DB 中,请查看答案
      • 感谢您的新答案,我编辑了我的代码,我有这个错误An exception occurred while executing 'INSERT INTO t_vote (vote_id, book_id, vt_ip) VALUES (?, ?, ?)' with params [null, null, null]: 所以我认为错误是因为我直接访问了 mysite/ajax/vote 但是当我转到索引并单击时按钮,它返回一个错误 500。
      【解决方案3】:

      我没有使用过 Silex,我对它不是很熟悉,但在查看 documentation

      您可以为大多数 HTTP 方法创建控制器。只需在您的应用程序上调用以下方法之一: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');
                  }
              });
          };
      });
      

      【讨论】:

        猜你喜欢
        • 2017-08-30
        • 2022-11-16
        • 1970-01-01
        • 2017-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多