Php Symfony 3.1普通html表单错误
我将symfony 3.1与常规html表单一起使用,以便更容易进行前端样式设计。我不断得到以下两个错误。一是, CSRF令牌无效。请尝试重新提交表单 第二个是 此表单不应包含额外字段 第一个原因是我不知道如何正确地将csrf令牌用于普通html表单。我的表单如下所示: FormType类:Php Symfony 3.1普通html表单错误,php,forms,symfony,Php,Forms,Symfony,我将symfony 3.1与常规html表单一起使用,以便更容易进行前端样式设计。我不断得到以下两个错误。一是, CSRF令牌无效。请尝试重新提交表单 第二个是 此表单不应包含额外字段 第一个原因是我不知道如何正确地将csrf令牌用于普通html表单。我的表单如下所示: FormType类: class TypeFormType extends AbstractType { public function buildForm(FormBuilderInterface $builder,
class TypeFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
->add('isActive', CheckboxType::class)
->add('descriptor');
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => 'AppBundle\Entity\Type',
'csrf_protection' => true,
//'allow_extra_fields' => true
]);
}
public function getName()
{
return 'app_bundle_type_form_type';
}
public function getBlockPrefix()
{
// removes the need for the form[$name] requirement for form inputs
return '';
}
}
html格式:
<form method="post">
<fieldset class="form-group">
<label for="name">Name</label>
<input type="text" class="form-control" id="name" name="name">
</fieldset>
<fieldset class="form-group">
<label for="descriptor">Descriptor</label>
<select class="form-control c-select" id="descriptor" name="descriptor">
<option value="Award">Award</option>
<option value="Donation">Donation</option>
<option value="Event">Event</option>
</select>
</fieldset>
<fieldset class="checkbox">
<label class="" for="isActive">
<input type="checkbox" id="isActive" name="isActive" checked> Active</label>
</fieldset>
<input type="hidden" name="_csrf_token" value="{{ csrf_token("app_bundle_type_form_type") }}">
<button type="submit" class="btn btn-primary-outline pull-right">Submit</button>
</form>
有人能告诉我我做错了什么吗?在Symfony中有更好的(且有效的)表单渲染方法:
在控制器中:
/**
* @Route("/admin/types/new", name="admin_types_new")
*/
public function newAction(Request $request)
{
$form = $this->createForm(TypeFormType::class);
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
dump($form->getData());die;
}
return $this->render('admin/type/new.html.twig');
}
/**
* @Route("/admin/types/new", name="admin_types_new")
*/
public function newAction(Request $request)
{
$form = $this->createForm(TypeFormType::class);
// ...
return $this->render('admin/type/new.html.twig', array('form' => $form->createView());
}
在模板中:
{{ form_start(form, {'action': path('admin_types_new'), 'method': 'POST'}) }}
{{ form_widget(form) }}
<input type="submit" />
{{ form_end(form) }}
{{form\u start(form,{'action':path('admin\u types\u new'),'method':'POST'}}}
{{form_widget(form)}
{{form_end(form)}}
请尝试这样做,因为这通常是一种更好的方法:您不必关心手工输入的html是否正确,是否存在所有ID和属性,或者是否正确生成了csrf。所有这些都是由Symfony完成的。在本例中,您只需要修改底层的FormType类和twig模板来塑造表单的字段
有关此主题的更多信息:
如果有人对我的补丁感兴趣,您似乎需要将您的令牌字段命名为“
\u token
”:
<input type="hidden" name="{{ form._token.vars.full_name }}" value="{{ form._token.vars.value }}" />
感谢您的回答这是一种非常有效的方法。然而,我希望能够在Symfony不生成标记的其他地方重用html。就像一个有角度的2个单页应用程序。因此,我需要后端表单来处理普通html表单。如果您感兴趣,我的解决方案如下。