私はJQuery AJAX呼び出しを通じてコメントを保存するコメントボックスを開発しています。CSRFがJQuery AJAXを通過するSymfony2フォーム
はJQuery
ここではそのためのjQueryのコード(これはシームレスに動作)は次のとおり
$(".post-comment").click(function() {
var $form = $(this).closest("form");
if($form)
{
$.ajax({
type: "POST",
url: Routing.generate('discussion_create'),
data: $form.serialize(),
cache: false,
success: function(html){
alert("Success!");
// Output something
}
});
}
else
{
alert("An error occured");
}
return false;
});
Symfony2のコントローラ
Symfony2の制御方法は、フォームのデータとプロセスをピックアップそれ。そのプロセスの一環として、フォームが有効かどうかを確認します。
$entry = new Discussion();
$discussionForm = $this->createForm(new DiscussionType(), $entry);
if ($request->getMethod() == 'POST') {
$discussionForm->bindRequest($request);
if ($discussionForm->isValid()) {
このチェックは真ではありません。
Array
(
[0] => The CSRF token is invalid. Please try to resubmit the form
)
CSRFトークンがちょうどフォームが同期提出された場合、それは同じようにポストを経由して渡されている。他には、私はエラーメッセージが与えられ、取得されているものを抽出します。
別の可能性のある問題..私は使用していますユニークなフォームIDが
フォームはフォーム型クラスによって作成されます。任意のページにいくつかのコメントフォームがあります。 Symfony2のフォームID属性を移入するための型クラスののgetName()メソッドを使用するように、私はのようにそれを変更した:これは、例えば同じIDなしで複数のコメントフォームを可能
public function getName()
{
return 'discussionForm' . $randomNumber;
}
DiscussionForm20、discussionForm21、discussionForm22など
標準のPHPロジックを使用して、symfony2フォームコンポーネントをミックスから削除し、フォームを生成/処理することができましたが、今はそれに抵抗しています。
フォームCSRFトークンが無効な理由は誰にも分かりますか?どのようにこれを修正することができるか、それをどうやって行うかに関する提案はありますか?
ここでは、JQueryの送信メソッドは重要ではありません。それを動作させるのは、$ .ajax呼び出しが、dataパラメータでシリアル化されたすべてのフォームデータを受け取るということです。 –