Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony 3.1普通html表单错误_Php_Forms_Symfony - Fatal编程技术网

Php Symfony 3.1普通html表单错误

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,

我将symfony 3.1与常规html表单一起使用,以便更容易进行前端样式设计。我不断得到以下两个错误。一是,

CSRF令牌无效。请尝试重新提交表单

第二个是

此表单不应包含额外字段

第一个原因是我不知道如何正确地将csrf令牌用于普通html表单。我的表单如下所示:

FormType类:

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>&nbsp;&nbsp;&nbsp;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表单。如果您感兴趣,我的解决方案如下。