Php 在JSON中序列化FormView数据

Php 在JSON中序列化FormView数据,php,ajax,json,angularjs,symfony,Php,Ajax,Json,Angularjs,Symfony,我试图改变渲染模板的方法。我使用的是服务器端模板引擎。现在我只需要从后端返回JSON而不是HTML,我需要将模板移到前端 作为一个新手,我面临的问题是模板包含表单时。换句话说,当最终的JSON还应该包含csrf令牌时。请以图书CRUD应用程序为例(一个实体Book(id\u Book,name))。读取记录的模板显示图书名称并允许删除图书 在Symfony2控制器中,我使用创建delete form对象的createFormBuilder()方法,我将createView()方法应用于该对象。后

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

作为一个新手,我面临的问题是模板包含表单时。换句话说,当最终的JSON还应该包含csrf令牌时。请以图书CRUD应用程序为例(一个实体
Book(id\u Book,name)
)。
读取
记录的模板显示图书名称并允许删除图书

在Symfony2控制器中,我使用创建delete form对象的
createFormBuilder()
方法,我将
createView()
方法应用于该对象。后者返回的对象由模板引擎(Twig)中的
form\u widget()
使用。最后:

<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>
问题是如何实现相同的Symfony2内部机制来呈现用于DELETE表单的csrf令牌,作为最终JSON的一部分来读取书籍实体?去掉
{{form\u widget(delete\u form)}}
及其所有长对象,只序列化具有图书名称的csrf令牌,这可以接受吗?这会影响什么?我觉得这对性能有好处,但如何呢


非常感谢您的指导。

您可以创建类似以下内容的小树枝文件:

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

那么,在禁用csrf_令牌时,如何防止该漏洞?书籍删除是非常重要的,恶意用户不应该删除。无论如何,感谢您推荐我从API中删除令牌,这是一个好主意,因为csrf令牌在会话期间对一个用户保持不变,所以我将在第一次渲染时将其放入javascript变量中,并进一步使用它。对此有何评论?我的意思是,取决于您是否有内部API或公共API。如果您正在开发一个没有sence的公共api,并且如果您有一个内部api,并且您使用OAuth进行身份验证,那么用户的令牌允许您防止该漏洞,您明白我的意思吗。我认为我正在同时构建一个内部和公共API(它是一个用于私人认证用户创建内容的公共网站,即通过登录表单进行认证的CRUD应用程序)。关于我的应用程序可以豁免csrf这一事实,我读到了如此不同的观点,以至于我无法完全理解(例如)。。。。。。。无论如何,我的困惑仍然很大,因为我是一个新手,我需要学习越来越多的知识,以便我能够完全理解所有涉及的概念(csrf、api…)。无论如何,谢谢你让我也认识了OAuth,我会在一些困惑消除后回到这里。欢迎你,别忘了感谢我的回答:-P
framework:
    csrf_protection:
        enabled:        false
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'csrf_protection' => false,
    ));
}