我正在尝试更改渲染模板的方法。我使用的是服务器端模板引擎。现在我只需要从后端而不是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令牌?这会产生什么影响?我觉得这对表现有好处但是怎么样?
非常感谢您的通常指导。
答案 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,
));
}