【问题标题】:Symfony3 - Best way to handle errors in JSON Rest API?Symfony3 - 处理 JSON Rest API 错误的最佳方法?
【发布时间】:2016-02-09 20:37:35
【问题描述】:

我正在使用 symfony3 开发一个简单的 Rest API(仅限 JSON)。我正在使用 Forms 来验证实体,但我想不出一种足够好的方法来处理表单错误并返回有意义的 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?

谢谢!

【问题讨论】:

    标签: php forms rest symfony


    【解决方案1】:

    如果您的表单无效,您可以检索如下错误:

        $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 响应中返回这些数据,在客户端您可以处理这些错误。由于您有字段名称,因此您可以在正确的表单字段附近显示它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-24
      • 2016-12-26
      • 2016-08-21
      • 2017-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多