Laravel异常处理
时间:2023-03-29 23:00:39
PHP
学习Laravel和Vuejs,来codecasts.com看优质视频教程上一篇介绍了Laravel异常和日志的一些情况。这篇文章来看看Laravel在处理异常和返回过程时是什么样子的。在Laravel项目中,当异常发生时,Laravel默认会去寻找这个类中的render()方法,因为这个方法负责处理渲染异常信息。所以如果想自定义异常的返回信息,可以直接在render()方法中实现,全凭自己的需要。一般情况下,Laravel会自动处理两种格式的异常信息:HTML或JSON。在此之前,它会先将所有的异常信息作为HTTPException处理:=newHttpException(403,$e->getMessage());}elseif($einstanceofTokenMismatchException){$e=newHttpException(419,$e->getMessage());}后面会讲到常见异常在Laravel中处理。认证异常处理认证异常是指Illuminate\Auth\AuthenticationException,由App\Exceptions的unauthenticated()方法处理。默认情况下,laravel会将用户重定向到/loginURL,但是如果你希望返回JSON数据,返回的信息大概如下:{"message":"Unauthenticated."}表单验证异常处理实际上是表单验证时失败,如果我们使用传统的重定向到某个页面,我们通常会使用类似下面的代码来提示错误信息:@if(count($errors)>0)@foreach($errors->all()as$error)- {{$error}}
@endforeach
@endif实际上是在表单验证发生错误时,它也可以直接以JSON格式返回。这时需要注意的是,返回的HTTP状态码为422:{"message":"给定的数据验证失败。","errors":{"name":["name字段为必填项。","名称字段必须是字符串。"]}}其他异常处理目前Laravel也是将大部分异常直接转化为HTTPException,但是在某些情况下,接下来还是需要我们自己处理异常返回信息。这个时候怎么办?使用expectsJson()!这种方式可以轻松满足我们团队的JSON返回需求!expectsJson()主要是通过指定一个特定的X-Requested-With头来实现的。如果这个头部携带了XMLHttpRequest的值,Laravel认为我们期望返回JSON格式的异常信息。如果你使用Laravel推荐的axios,你可以在assets下的bootstrap.js文件中看到,Laravel官方会为你指定这个header:window.axios.defaults.headers.common['X-Requested-With']='XMLHttpRequest';所以当我们使用expectsJson()返回异常信息时,大致格式如下:{"message":"...","file":"...","line":0,"trace":"..."}当我们在前端处理时,我们通常只是得到消息。如果是普通的HTML返回格式呢?这时候你其实可以在resources/views/errors中定义一个500.blade.php文件,Laravel默认会先显示这个视图文件的内容。如果没有自定义,则返回普通的:哎呀,好像出错了。综上所述,Laravel的异常处理通常会转化为HTTPException,而我们在使用AJAX时,也可以直接使用expectsJson()来判断以何种格式返回Information。这样基本解决了90%以上的应用场景。关注codecast公众号,定时送书福利!