【问题标题】:Symfony2.4 form 'This form should not contain extra fields' errorSymfony2.4 表单“此表单不应包含额外字段”错误
【发布时间】:2014-05-25 23:33:54
【问题描述】:

我正在尝试基于 REST api ang AngularJS 构建应用程序。我一直在关注本教程http://npmasters.com/2012/11/25/Symfony2-Rest-FOSRestBundle.html,但必须更改一些细节(折旧的方法),现在当我发布创建新实体时,我收到“此表单不应包含额外字段”错误。

class MainController extends Controller
{
    public function indexAction(Request $request)
    {
        $form = $this->createForm(new TaskType(),null,array('action' => $this->generateUrl('post_tasks').'.json'))
                ->add('submit','submit');


        $note_form = $this->createForm(new NoteType())
                ->add('submit','submit');

        return $this->render('MyBundle:Main:index.html.twig',
                array(
                    'form'=>$form->createView(),
                    'note_form'=>$note_form->createView(),
                )
        );
    }
}

我的 TaskType 表单:

 public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder

            ->add('timeStart','datetime',array(
                'date_widget' => 'single_text',
                'time_widget' => 'single_text',
                'date_format' => 'yyyy-MM-dd',
                'data' => new \DateTime('now')
            ))

            ->add('timeStop','datetime',array(
                'date_widget' => 'single_text',
                'time_widget' => 'single_text',
                'date_format' => 'yyyy-MM-dd',
                'data' => new \DateTime('now')
            ))

            ->add('project')  
            ->add('descriptionTask')
            ->add('isCompleted',null,array('required' => false))  
            ->add('isVisible',null,array('required' => false))
        ;
    }

在我看来,我现在只呈现一个表单,但 我正处于测试阶段

{%extends 'MyBundle::layout.html.twig' %}

{%block content %}

<div ng-view></div>

{{ form(form) }}

{% endblock %}

这是应该刷新给定实体的 REST 控制器:

public function cpostAction(Request $request)
{
 $entity = new Task();
 $form = $this->createForm(new TaskType(), $entity);
 $form->handleRequest($request);

 if ($form->isValid()) {

     $em = $this->getDoctrine()->getManager();
     $em->persist($entity);
     $em->flush();

     return $this->redirectView(
             $this->generateUrl(
                 'get_organisation',
                 array('id' => $entity->getId())
                 ),
             Codes::HTTP_CREATED
             );
 }

 return array(
     'form' => $form,
 );
}

奇怪的事情:当我将相同的代码从 REST 控制器放到 MainController 时,表单被验证并且新实体正在被刷新,但是 REST 控制器以某种方式抛出错误......

【问题讨论】:

    标签: php forms angularjs symfony symfony-2.4


    【解决方案1】:

    这是因为当您生成表单时,您添加了提交按钮,但是当您验证它们时却没有。试试:

    public function cpostAction(Request $request)
    {
        $entity = new Task();
        $form = $this->createForm(new TaskType(), $entity)->add('submit','submit');
        ...
    

    提交按钮在技术上是一个字段,即使默认情况下 symfony 不会将它映射到实体属性。因此,当您使用提交按钮生成表单然后提交该表单时,您在验证控制器操作中生成的表单也需要有一个提交按钮。

    【讨论】:

    • 非常感谢您的解决方案。你知道是否有一种解决方案不需要我在每个表单处理程序上都这样做?
    • 是的,而不是事后添加提交,将其添加到您的类型中
    【解决方案2】:

    如果你想禁用字段验证,你必须添加

    public function setDefaultOptions(\Symfony\Component\OptionsResolver\OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'csrf_protection' => false,
            'validation_groups' => false,
        ));
    }
    

    在 buildForm 方法中:

        public function buildForm(FormBuilderInterface $builder, array $options) {
            $builder->addEventListener(FormEvents::POST_SUBMIT, function ($event) {
                $event->stopPropagation();
            }, 900);
            $builder->add('field1','text')
                    ->add('field2','text')
                    .
                    .
                    .
        } 
    

    更多详情:http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html#cookbook-dynamic-form-modification-suppressing-form-validation

    【讨论】:

    • 请记住,禁用 csrf 是一种可怕的、可怕的安全做法。总有解决问题的更好方法。
    • @csvan 但也不适用于restful API
    【解决方案3】:

    如果您希望验证器忽略其他字段,您应该尝试将 'allow_extra_fields' =&gt; true 作为选项传递给 FormBuilder。

    【讨论】:

    • 注意:allow_extra_fields 选项已在 Symfony v2.6 中添加
    【解决方案4】:

    如果您要添加单个 SubmitType 按钮或类似按钮,则使用 Chausser 指示的解决方案

    $entity = new Task();
    $form = $this->createForm(new TaskType(), $entity)->add('submit','SubmitType::class');
    

    但是,如果您使用 CollectionType 并嵌入一组子表单,则需要在该类型的参数中包含 'allow_add' => true。例如,在您的 EntityType 表单构建器中:

    $builder->add('subEntities', CollectionType::class, array(
                    'entry_type' => SubEntityType::class,
                    'entry_options' => array('label' => false),
                    'allow_add' => true,
                ))
    

    如果您有多个级别,请确保对所有级别的嵌入都执行此操作。

    【讨论】:

      【解决方案5】:

      在 CustomFormType 中使用 Symfony 4/5

      public function configureOptions(OptionsResolver $resolver)
      {
          $resolver->setDefaults([
              'data_class' => CustomFormType::class,
              'allow_extra_fields' => true // <<<<<<<<<<<<<<<<<<<<<
          ]);
      }
      

      【讨论】:

        猜你喜欢
        • 2017-01-12
        • 1970-01-01
        • 2013-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-02
        相关资源
        最近更新 更多