symfony4-form-> isValid()返回false,而form-> getErrors返回空数组

时间:2018-09-24 21:48:04

标签: symfony4 fosrestbundle

我将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);
    }

并请求我发送的数据:

  

{“ name”:“ asd”,   “ nameKey”:“ AS”,   “ description”:“ Simple desc”,   “优先级”:“ 1”,   “ deadline”:“ 2016-09-01 21:02:20”,   “有效”:是,   “ assignedCustomers”:{},   “ assignedUsers”:{}}

1 个答案:

答案 0 :(得分:0)

您可能在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);
相关问题