在Laravel中创建记录时捕获错误的最佳方法

在Laravel中创建记录时捕获错误的最佳方法,laravel,laravel-5,Laravel,Laravel 5,我有下面的代码,它在job\u titles表中插入了记录,运行得非常好。我在代码中使用了双重检查以防失败(Try/Catch和If语句)。我需要知道这是真的需要还是只有一种方法可以满足。如果只有一种方法是足够的,那么我应该使用哪一种 public function store(Request $request) { try { $rules = [ 'code' => 'required | max:4 |

我有下面的代码,它在
job\u titles
表中插入了记录,运行得非常好。我在代码中使用了双重检查以防失败(Try/Catch和If语句)。我需要知道这是真的需要还是只有一种方法可以满足。如果只有一种方法是足够的,那么我应该使用哪一种

public function store(Request $request)
    {

        try {
            $rules = [
                'code' => 'required | max:4 | unique:job_titles,code',
                'title' => 'required',
                'description' => 'required'
            ];

            $validated = Validator::make($request->all(), $rules);


            if ($validated->fails()) {
                return response()->json(['status' => 'error', 'message' => 'Please correct validation errors', 'errors' => $validated->errors()]);
            }

            $newJobTitle = JobTitle::create([
                'title' => $request->get('title'),
                'code' => strtoupper($request->get('code')),
                'description' => $request->get('description')
            ]);
            if (!$newJobTitle) {
                return response()->json(['status' => 'error', 'message' => 'Something went wrong!!']);
            }

            return response()->json([
                'status' => 'success',
                'message' => 'Job Title ' . $request->get('title') . ' created successfully'
            ]);
        } catch (\Exception $e) {
            return response()->json(['status' => 'error', 'message' => 'Something went wrong!!', 'exception_message' => $e]);
        }

    }
我对以下几点感到困惑:

try{
}catch(Exception e)
{
}

 $newJobTitle = JobTitle::create([
                'title' => $request->get('title'),
                'code' => strtoupper($request->get('code')),
                'description' => $request->get('description')
            ]);
            if (!$newJobTitle) {
                return response()->json(['status' => 'error', 'message' => 'Something went wrong!!']);
            }


上述两个选项将使您能够更精确地控制如何对抛出的特定异常做出反应。但是,比较truthy值不会执行
异常
,因此您可以看到,在报告错误的需求中,您最终会有冗余。当没有
$newJobTitle
时,您可以在此处抛出异常,而不是返回响应:

if (! $newJobTitle) {
    throw new Exception('Job title does not exist');
}
现在,当您返回消息时,可以使用
$e->getMessage()

但是,您可以有自己的自定义异常,例如,
JobTitleMissingException

现在,您可以抛出
JobTitleMissingException
并捕获该异常,这样您就可以返回不同的错误代码,例如:

catch(JobTitleMissingException $e) {
    return response()->json(['status' => 'error-job-title', 'message' => $e->getMessage()]);
} catch (\Exception $e) {
    return response()->json(['status' => 'error', 'message' => $e->getMessage()]);
}

通常,在处理数据库时使用try/catch块是一种很好的做法,这样您就可以处理以下异常:

  • 完整性约束冲突
  • 唯一约束
并返回最终用户能够理解的良好响应,例如电子邮件已经存在,而不是出现问题

让我们以注册场景为例:

如果您有一个用户表,其结构如下所示: id(AI)、电子邮件(唯一)、密码

用户1尝试通过电子邮件注册user1@gmail.com一切正常,但当另一个用户尝试注册同一封电子邮件时,您的查询将以电子邮件列的唯一约束冲突和try/catch结束,您完全知道发生了什么

因此,如果使用第二种方法:

    if (!$newJobTitle) {
        return response()->json(['status' => 'error', 'message' => 'Something went wrong!!']);
    }
你不知道发生了什么

提示:您不需要将所有代码包装在try/catch中

这就足够了:

try{
$newJobTitle = JobTitle::create([
                'title' => $request->get('title'),
                'code' => strtoupper($request->get('code')),
                'description' => $request->get('description')
            ]);
}catch(\Exception $e) {
}

下面是我要做的:

$rules = [
   'code' => 'required | max:4 | unique:job_titles,code',
   'title' => 'required',
   'description' => 'required'
];
$this->validate($request, $rules);
$newJobTitle = JobTitle::create([
       'title' => $request->get('title'),
      'code' => strtoupper($request->get('code')),
      'description' => $request->get('description')
]);
return response()->json([
        'status' => 'success',
        'message' => 'Job Title ' . $request->get('title') . ' created successfully'
]);
就这样。如果验证失败,框架将抛出一个验证异常,该异常将转换为带有错误的重定向响应(传递给视图),或者转换为JSON错误响应(如果请求是通过AJAX完成的)


这应该足够了。请注意,我并没有把整件事都放在试一试中。仅包装部件并捕获异常您可以在try-catch中处理。捕获所有内容只是为了返回一个通用的“oops”消息是毫无意义和混乱的,因为您可以使用通用异常处理程序方法和/或关闭函数来实现这一点,哪个Laravel也有,所以除了自定义错误之外,您不需要做任何事情。500视图。

Laravel验证程序已经对发生的错误抛出了一个适当的异常,如果请求接受JSON,它将作为JSON响应发送。那部分不需要试一试。在发送错误响应时,您还必须返回错误响应代码。
$rules = [
   'code' => 'required | max:4 | unique:job_titles,code',
   'title' => 'required',
   'description' => 'required'
];
$this->validate($request, $rules);
$newJobTitle = JobTitle::create([
       'title' => $request->get('title'),
      'code' => strtoupper($request->get('code')),
      'description' => $request->get('description')
]);
return response()->json([
        'status' => 'success',
        'message' => 'Job Title ' . $request->get('title') . ' created successfully'
]);