Forms 提交嵌入表单时处理csrf令牌

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

使用Symfony2.3.4

在我的项目中,我有以下课程:服务、交通、餐饮和住宿。
我将后者三个嵌入到内部服务中

我正在开发带有嵌入表单的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
    }
}