2016-02-09 104 views
3

我正在用symfony3开发一个简单的Rest API(仅限JSON)。我正在使用Forms来验证实体,但是我找不到一个足够好的方式来处理表单错误并返回有意义的json错误响应。下面是我的控制器的动作例:Symfony3 - 处理JSON Rest API中错误的最佳方法?

/** 
* @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还有很好的理由吗?

谢谢!

回答

8

如果你的表格是无效的,你可以像检索错误:

$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响应中,并且在客户端您可以处理这些错误。既然你有字段名称,你可以在正确的表单域附近显示它们。

相关问题