在JSON中序列化FormView数据

时间:2015-07-25 02:46:40

标签: php ajax json angularjs symfony

我正在尝试更改渲染模板的方法。我使用的是服务器端模板引擎。现在我只需要从后端而不是HTML返回JSON,我需要将我的模板移到前端。

我作为新手的问题是,当模板包含表单时。换句话说,当最终的JSON也应该包含一个csrf标记。请以书籍的CRUD应用程序为例(一个实体Book(id_book, name))。 Read记录的模板显示书名并允许删除书籍。

在Symfony2控制器中,我使用createFormBuilder()方法创建删除表单对象,我应用createView()方法。后者返回的对象由form_widget()在模板引擎(Twig)中使用。最后:

<div id="bookName">{{book.name}}</div>
<div id="bookDelete">
      <form action="{{ path('book_delete', { 'id': book.id }) }}" method="post">
          <input type="hidden" name="_method" value="DELETE" />
          {{ form_widget(delete_form) }}
          <button type="submit"></button>
      </form>
</div>

将返回:

<div id="bookName">Symfony2 In Depth</div>
<div id="bookDelete">
    <form action="/web/app_dev.php/deletes" method="post">
         <input type="hidden" name="_method" value="DELETE">
         <div id="form">
             <input type="hidden" id="form_id" name="form[id]" value="15">
             <input type="hidden" id="form__token" name="form[_token]" value="dd6573ae916ae30f78ba35a8c67e5d42a2764c1c">
        </div>
        <button type="submit"></button>
    </form>

将模板渲染移动到前端时,我想象的是来自服务器的最终JSON,如下所示:

{
'id':15,
'name': 'Symfony2 in Depth',
'csrf_token' : 'dd6573ae916ae30f78ba35a8c67e5d42a2764c1c'    
}

问题是如何实现相同的Symfony2内部机制来为DELETE表单呈现csrf标记,作为读取图书实体的最终JSON的一部分?是否可以删除{{ form_widget(delete_form) }}及其所有长对象,并仅使用书名序列化csrf令牌?这会产生什么影响?我觉得这对表现有好处但是怎么样?

非常感谢您的通常指导。

1 个答案:

答案 0 :(得分:2)

您可以创建类似于:

的twig文件
{
    'id': '{{ form.id.vars.value }}'
    'name': '{{ form.name.vars.value }}'
    'csrf_token': '{{ form._token.vars.value }}'
}

无论如何我不推荐你在使用API​​时使用csrf令牌,如果你禁用它会更好。如果要在config.yml中禁用所有应用程序:

framework:
    csrf_protection:
        enabled:        false

或者只是在“表单”中添加一个表单:

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'csrf_protection' => false,
    ));
}