相关疑难解决方法(0)

在Symfony2中手动创建表单,但仍然使用其CSRF和isValid()功能

好吧,我用Google搜索了这一点,但我发现的所有内容都是在常规Symfony表单处理(例如form_widget(),创建FormType类等)的上下文中讨论Symfony表单.我的Symfony项目中有很多这样的表单,它们运行得很好.

但:

我还有一些非常复杂的AJAX表单,我想手动构建(使用普通的旧HTML和JS).我仍然希望利用Symfony的表单验证功能和CSRF保护.但是,出于某种原因,当使用isValid()手动创建表单时,我无法使CSRF正常工作.

这是我想要完成的一个例子:

在我的视图控制器中,我设置了_token:

$_token = $this->get('form.csrf_provider')->generateCsrfToken('form');
Run Code Online (Sandbox Code Playgroud)

在我看来(手动创建的表单)(从我的视图控制器获取_token):

<html>
  <form method="post">
    <input type="hidden" name="form[_token]" value="{{ _token }}">
    <input type="hidden" name="form[id]" value="1">
    <input type="submit" value="Submit">
  </form>
</html>
Run Code Online (Sandbox Code Playgroud)

在我的动作控制器中(当表单提交时,我正在尝试执行以下操作):

//Create form (for validation purposes)
$form = $this->get('form.factory')
  ->createBuilder('form', array('id' => $request->get('id')))
  ->add('id', 'hidden')
  ->getForm();

//Bind form
$form->bind($request)

//Validate form
if($form->isValid()) {
  //... save data
}

//Return response...
Run Code Online (Sandbox Code Playgroud)

出于某种原因,我不能让isValid()工作,我怀疑我的_token是没有正确使用的东西,但我不明白为什么.有没有人真正使手动表单与Symfony组件一起工作?有没有人对如何使这项工作有任何建议?

基本上,我想要完成的是:

  1. 手动创建HTML表单(具有CSFR保护且没有 TWIG表单小部件功能)

  2. 使用Symfony的表单功能来验证该表单

谢谢.

symfony

17
推荐指数
2
解决办法
1万
查看次数

Symfony 2 - 删除表单和CSRF令牌

我有一个来自数据库的条目列表.我想在每一行的末尾都有一个"删除按钮",这样用户就不必首先进入编辑/显示页面来删除该条目.

我尝试使用csrf标记创建一个隐藏的输入字段,如下所示:

return $this->createFormBuilder()
   ->getForm()
;
Run Code Online (Sandbox Code Playgroud)

这将输出:

<div id="form">
   <input type="hidden" id="form__token" name="form[_token]" value="6c98ebfa9df07.....">
</div>
Run Code Online (Sandbox Code Playgroud)

表单的其余部分放在twig模板中,以便每个表单根据条目的id有自己的操作路径.

不幸的是在树枝模板中只有第一个

{{ form_widget(delete_form) }}
Run Code Online (Sandbox Code Playgroud)

将被渲染.

我怎样才能更频繁地使用这个隐藏的字段?或者有没有办法以不同的方式完成这一切?

谢谢你的帮助

public function indexAction()
    {
        $em = $this->getDoctrine()->getManager();

        $deleteForm = $this->createDeleteForms();

        $entities = $em->getRepository('IntranetServicesBundle:Laender')->findAll();

        return $this->render('IntranetServicesBundle:Laender:index.html.twig', array(
            'entities' => $entities,
            'delete_form' => $deleteForm->createView(),
        ));
    }


private function createDeleteForms()
{
    return $this->createFormBuilder()
        ->add('id', 'hidden')
        ->getForm()
    ;
}
Run Code Online (Sandbox Code Playgroud)

ajax csrf symfony twig

8
推荐指数
1
解决办法
5490
查看次数

标签 统计

symfony ×2

ajax ×1

csrf ×1

twig ×1