Forms 提交嵌入表单时处理csrf令牌
使用Symfony2.3.4 在我的项目中,我有以下课程:服务、交通、餐饮和住宿。Forms 提交嵌入表单时处理csrf令牌,forms,symfony,token,csrf,Forms,Symfony,Token,Csrf,使用Symfony2.3.4 在我的项目中,我有以下课程:服务、交通、餐饮和住宿。 我将后者三个嵌入到内部服务中 我正在开发带有嵌入表单的Services的new.html.twig视图,我让它显示所有三个实体的表单。只有一个细节我不满意: 以下是目前的代码: ////ServicesController.php public function newAction(Request $request, $id_person, $id_edition) { $entity = new
我将后者三个嵌入到内部服务中 我正在开发带有嵌入表单的Services的new.html.twig视图,我让它显示所有三个实体的表单。只有一个细节我不满意: 以下是目前的代码:
////ServicesController.php
public function newAction(Request $request, $id_person, $id_edition) {
$entity = new Services();
$meals = new Meals();
$lodging = new Lodging();
$transport = new Transport();
$transport2 = new Transport();
$entity->addLodging($lodging);
$entity->addTransport($transport);
$entity->addTransport($transport2);
$entity->addMeals($meals);
$form = $this->createCreateForm($entity);
$form->bind($request);
暂停:最后一行代码是我需要一些建议的代码:首先,我把它放在这里是因为我读了什么,但是如果我这样做,我会得到CSRF令牌无效。请尝试重新提交表单。错误,我将其取出并修复,这是正确的方法吗?我是否应该做其他事情?关于它的任何见解
//continues...
return $this->render('ServicesBundle:Services:new.html.twig', array(
'form' => $form->createView(),
'id_person' => $id_person,
'id_edition' => $id_edition));
}
以及以下观点:
{# Services' new.html.twig #}
{% extends 'AdminBundle:Default:admin.html.twig' %}
{% block content -%}
<div class="row-fluid">
<h2 class="new-tag">Services</h2>
<form class="form-horizontal sf_admin_form_area"
action="{{ path('services_create',{'id_peson':person.id}) }}"
method="post" {{ form_enctype(form) }}>
{{form_errors(form)}}
由于您仅在添加
$form->bind($request)
时收到消息,因此建议您尝试以下操作:
if ('POST' === $request->getMethod()) {
$form->bind($request);
if ($form->isValid()) {
// Do something
}
}
您只需在提交时将请求绑定到表单,因为只有在提交时表单才包含数据。这样您就可以保留CSRF令牌。当然,您还必须在视图中保留{{form\u widget(form.\u token)}
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('lodging', 'collection', array(
'type' => new LodgingType()));
$builder->add('transport', 'collection', array(
'type' => new TransportType()));
$builder->add('meals', 'collection', array(
'type' => new MealsType(),
'allow_add' => true));
}
if ('POST' === $request->getMethod()) {
$form->bind($request);
if ($form->isValid()) {
// Do something
}
}