我将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”:{}}
答案 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);