form->isValid() 返回 false 和 form->getErrors 返回空数组



我将symfony 4与FOSRestBundle一起使用。 我有控制器:

/**
* @Route("/api")
*/
class ProjectController extends FOSRestController
{
/**
* @FOSRestPost("/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,但响应正文[]

如何出现字段错误?或者也许我做错了什么?

有项目类型:

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", "名称键": "AS", "描述": "简单描述", "优先级": "1", "截止日期": "2016-09-01 21:02:20", "活动":真, "分配的客户": {}, "assignedUsers": {} }

很可能您在 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);

最新更新