我正在使用symfony3开发一个简单的Rest API(仅限JSON(。我正在使用表单来验证实体,但我无法找到一种足够好的方法来处理表单错误并返回有意义的 json 错误响应。以下是我的控制器的示例操作:
/**
* @Route("/user/add" , name="addUser")
* @Method({"POST"})
*
* @param Request $request
* @return JsonResponse
*/
public function registerAction(Request $request) {
$user = new User();
$form = $this->createForm(UserType::class, $user, ['validation_groups' => ['registration']] );
$form->handleRequest($request);
if(!$form->isValid()){
//TODO: Handle errors properly
}
$this->get('user_service')->addUser($user);
$userModel = new UserModel($user);
return new JsonResponse($userModel);
}
我正在考虑抛出一个包含表单数据/错误的自定义异常,而不是将异常处理到自定义异常侦听器中,解析表单并返回 JsonResponse。但我不确定这是否是处理表单错误的正确方法。我已经阅读了很多关于创建REST API和使用symfony处理错误的正确方法的文章。许多文章都使用 FOSRestBundle,但我无法理解在简单的仅限 JSON 的 API 中使用此捆绑包的意义。
有人可以给我一些建议,如何正确处理 symfony3 REST API 中的错误吗?而且,在当前示例中,您认为使用FOSRestBundle是否有充分的理由?
谢谢!
如果您的表单无效,您可以检索如下错误:
$errors = [];
foreach ($form->getErrors(true) as $error) {
if ($error->getOrigin()) {
$errors[$error->getOrigin()->getName()][] = $error->getMessage();
}
}
您将获得一个填充有一个或多个错误的字段的数组:
[
'field_name' => [
'text of error 1',
'text of error 2',
],
'other_field_name' => [
'text of error 1',
],
]
然后在 JSON 响应中返回这些数据,在客户端可以处理这些错误。由于您有字段名称,因此可以在正确的表单字段附近显示它们。