2016-05-17 1 views
1

私の新しいサイトを構築するために、私はSilexフレームワークを試すことにしました。私は文書で多くを読んだので、今まで問題はなかった。SilexでAjaxクエリを使用するには?

私は投票システムを作っています。私はそれをAjaxで動的に使用したいと思います。

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

その後

app.php:私はサービスを登録し

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

のroutes.php:

だから、最初に私がルートを宣言しました、関連するコントローラがされています。私は、投票ボタンをクリックしたときに

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

、投票機能:

マイDAOクラス

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ボタンをクリックすると、エラーアラートが表示されます。私はリンク個人用サイト/ AJAX /投票を訪れたとき、私はこのエラーがあります:

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

私は公式ドキュメントでは、前のStackOverflowの質問でチェックが、私は唯一のquestion 22011254を発見し、それが私を助けにはなりませんでした。 ..

EDIT:私は、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

ありがとうございます。私のエラーは次のとおりです: 'Notice:未定義のプロパティ:mysite \ Controller \ HomeController :: $ request' – cyclone200

+0

' $ this-> request'ではなく '$ request'です。私の答え –

+0

あなたの答えで私のコードを編集しましたが、「INSERT INTO t_vote(musite \ Domain \ Voteid、mysite \ Domain \ Votevote_id、mysite \ Domain \ Votebook_id、mysite \ Domain \ 'null、null、null、null]:' ... AjaxDAOで '(配列)'を使用しましたが、$データを挿入したいときに配列を期待していてオブジェクトだった。 – cyclone200

0

私はサイレックスを使用していないと私はそれに慣れたが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'); 
      } 
     }); 
    }; 
}); 
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'); 

::また、これを変更することができ

指定方法なしmatch以来

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

は、要求のすべてのタイプと一致します。今は問題ではないかもしれませんが、後でトラブルを救うでしょう。

関連する問題