【问题标题】:symfony4 - form->isValid() return false and form->getErrors return empty arraysymfony4 - form->isValid() 返回 false 并且 form->getErrors 返回空数组
【发布时间】:2018-09-24 21:48:04
【问题描述】:

我使用 symfony 4 和 FOSRestBundle。 我有控制器:

/**
 * @Route("/api")
 */
class ProjectController extends FOSRestController
{
    /**
     * @FOSRest\Post("/project")
     */
    public function postProjectAction(Request $request, ValidatorInterface $validator)
    {
        $project = new Project();

        $project->setCreatedBy($this->getUser()->getUser());

        $project->setCreatedAt(new \DateTime());

        $form = $this->createForm(ProjectType::class, $project);

        $form->submit($request->request->all());

        if ($form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($project);
            $em->flush();
            return new JsonResponse([
                'status' => 'created'
            ], 200);
        }
        return new JsonResponse($form->getErrors(true, false), 400);
    }

}

当我转储 $form->isValid() 时,我得到了 false,但响应正文是 []

我怎样才能得到字段错误?或者我做错了什么?

有ProjectType:

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', TextType::class,
                [
                    'label' => 'label.name'
                ]
            )
            ->add('nameKey', TextType::class,
                [
                    'label' => 'label.nameKey'
                ]
            )
            ->add('description', TextareaType::class,
                [
                    'label' => 'label.description'
                ]
            )
            ->add('deadline', DateTimeType::class,
                [
                    'label' => 'label.deadline',
                    'widget' => 'single_text',
                    'html5' => false,
                    'attr' => [
                        'class' => 'bootstrap-datetimepicker'
                    ],
                    'format' => 'yyyy-mm-dd HH:ii'
                ]
            )
            ->add('active', ChoiceType::class,
                [
                    'label' => 'label.active',
                    'choices' => [
                        'label.yes' => true,
                        'label.no' => false
                    ]
                ]
            )
            ->add('priority', EntityType::class,
                [
                    'class' => Priority::class,
                    'choice_label' => 'name',
                    'label' => 'label.priority',
                ]
            )
            ->add('assignedUsers', EntityType::class, 
                [
                    'class' => User::class,
                    'choice_label' => 'email',
                    'label' => 'label.',
                    'multiple' => true,
                ]
            )
            ->add('assignedCustomers', EntityType::class, 
                [
                    'class' => Customer::class,
                    'choice_label' => 'email',
                    'label' => 'label.',
                ]
            )
        ;

        $builder->get('priority')->addModelTransformer($this->priorityToNumberTransformer);
        $builder->get('assignedUsers')->addModelTransformer($this->userToNumberTransformer);
        $builder->get('assignedCustomers')->addModelTransformer($this->customerToNumberTransformer);
    }

并请求我发送的数据:

{ "名称": "asd", "nameKey": "AS", "description": "简单描述", “优先级”:“1”, "截止日期": "2016-09-01 21:02:20", “活跃”:是的, "assignedCustomers": {}, “assignedUsers”:{} }

【问题讨论】:

    标签: symfony4 fosrestbundle


    【解决方案1】:

    您可能在 CSRF 保护方面遇到问题。尝试创建表单并禁用 CSRF 保护。 在无状态 API 上设置 CSRF 保护非常无用,但默认启用。

    您可以在创建表单时禁用它:

    $form = $this->createForm(ProjectType::class, $project, [
        'csrf_protection' => false,
    ]);
    

    或者你通过配置禁用它,通过定义一个用户角色:

    fos_rest:
        disable_csrf_role: ROLE_API
    

    见https://symfony.com/doc/current/bundles/FOSRestBundle/2-the-view-layer.html#csrf-validation

    当您遇到表单验证错误时,您应该返回不同的视图。根据文档https://symfony.com/doc/current/bundles/FOSRestBundle/2-the-view-layer.html#forms-and-views,这可能类似于:

    return new View($form, Response::HTTP_BAD_REQUEST);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      • 2018-12-01
      • 1970-01-01
      相关资源
      最近更新 更多