资讯专栏INFORMATION COLUMN

自定义 Laravel Validator 所返回的响应

dack / 1210人阅读

摘要:但是,这个响应的状态码,是。众所周知的验证器会抛出一个异常,此异常在被捕获后会被的基异常处理器给渲染成响应判断是否为请求也是在这里做的。

原文地址:https://prinzeugen.net/custom...

不得不说 Laravel 的 Validation 是极好的,非常易于使用,麻麻再也不用担心我要写一大堆验证啦 ~( ^ω^)

但是这个 Validator 有一个神秘的地方 ( -д-),正如官方文档所说,它会自动判断当前请求是否为 Ajax 发送的,如果是,则在验证失败的时候返回一个 JsonResponse 响应而不是 RedirectResponse 响应。

但是,这个 JSON 响应的状态码,是 422。

WTF!坑爹呢这是!要知道 422 这个状态码是通不过 jQuery.ajax.success 的啊!

在网上找了一圈,愣是没找着什么好一点的解决方法(全是叫你在 $.ajax.failed 里处理错误的)。

没办法,自己动手丰衣足食,总之先看看文档:自定义闪存的错误消息格式

哦哦,看来我们可以在控制器基类中自定义错误的格式,于是我试着在 formatValidationErrors 方法中返回了一个状态码为 200 的 IlluminateHttpJsonResponse。但是这样是行不通的,这个方法要求我们要返回一个数组,所以我们就不能使用这种小 trick 了(当然如果你愿意直接在这个方法里输出 JSON 文本然后 exit 的话也没事)。

既然这里没办法了,我们就得从 ExceptionHandler 下手了。众所周知 Laravel 的验证器会抛出一个 ValidationException 异常,此异常在被捕获后会被 Laravel 的基异常处理器给渲染成 Http 响应(判断是否为 Ajax 请求也是在这里做的)。

找到 Laravel 的基异常处理器 IlluminateFoundationExceptionsHandler 后,我们可以发现对于 ValidationException 这类的异常,Laravel 是直接从里面取出响应返回回去的。也就是说,具体的异常渲染是在 ValidationException 对象内完成的:

/**
 * Render an exception into a response.
 *
 * @param  IlluminateHttpRequest  $request
 * @param  Exception  $e
 * @return SymfonyComponentHttpFoundationResponse
 */
public function render($request, Exception $e)
{
    if ($e instanceof HttpResponseException) {
        return $e->getResponse();
    } elseif ($e instanceof ModelNotFoundException) {
        $e = new NotFoundHttpException($e->getMessage(), $e);
    } elseif ($e instanceof AuthenticationException) {
        return $this->unauthenticated($request, $e);
    } elseif ($e instanceof AuthorizationException) {
        $e = new HttpException(403, $e->getMessage());
    } elseif ($e instanceof ValidationException && $e->getResponse()) {
        # 注意这里
        return $e->getResponse();
    }

    if ($this->isHttpException($e)) {
        return $this->toIlluminateResponse($this->renderHttpException($e), $e);
    } else {
        return $this->toIlluminateResponse($this->convertExceptionToResponse($e), $e);
    }
}

一颗赛艇!既然看到了希望,我们就继续找下去。不过既然知道了 Laravel 原本的异常处理器是直接取出响应就输出出去了,那我们就先看看这个取出来的 Response 到底是个啥:

class Handler extends ExceptionHandler
{
    public function render($request, Exception $e)
    {
        if ($e instanceof ValidationException) {
            dd($e->getResponse());
        }
    }
}

这里我们用到了 Laravel 一票帮助函数中非常好用的一个函数 —— dd(),这个函数的功能差不多就是一个漂亮的 var_dump() 加上 exit(),用来调试再方便不过了:

哦?这个方法得到的竟然是一个标准的 JsonResponse 响应!

既然是这样,那我们就可以很方便的使用它的 setStatusCode 方法来设置其响应码了。这个方法是继承自 SymfonyComponentHttpFoundationResponse 的,有兴趣的可以去读一读。

综上所述,最后我们所需要做的就只是在 app/Exceptions/Handler.phphandle 方法中添加一个对于 ValidationException 的判断:

if ($e instanceof ValidationException) {
    return $e->getResponse()->setStatusCode(200);
}

结果如下:

谨以此文记录,愿能帮到后来人~ (ゝ∀・)

当然你如果对于代码的整洁没那么多要求的话也用不着用这种方法就是了

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30442.html

相关文章

  • Laravel思维导图之HTTP请求、响应、表单验证

    摘要:今天我来分享中层关于请求响应与表单验证的知识。手动创建验证请求之前的内容是直接使用的方法来实现表单验证。下一步到这篇为止,我完成了入门指南核心概念层的路由中间件控制器请求响应表单验证的学习和整理。 showImg(https://segmentfault.com/img/remote/1460000010882838); 今天我来分享 Laravel 中 HTTP 层关于请求、响应与表...

    lewif 评论0 收藏0
  • Web API 开发实践

    摘要:通过业务处理异常,将不正常的业务处理结果返回给调用者或其他。通常会在层中写与数据库相关的代码,如表的关联关系,表属性的可取值等。返回此类响应表示服务器抛出了未捕捉处理的异常或错误。 前言 之前在公司负责了一个项目,进行了前后端分离,笔者负责了整个项目的基本结构的搭建,在此总结一些经验。本文主要介绍后端web api的设计与实现。demo代码链接:github代码 基本架构 代码分层 应...

    doodlewind 评论0 收藏0
  • 【日常手记】之Laravel5.3

    摘要:个人网站最近刚写了一个手机在线播放的电影站使用日常手记更新使用的的查询作用域的本地作用域去自定义可复用的约束集合,方便链式调用什么是本地查询作用域本地作用域允许我们定义通用的约束集合以便在应用中复用。 关于作者 程序开发人员,不拘泥于语言与技术,目前主要从事PHP和前端开发,使用Laravel和VueJs,App端使用Apicloud混合式开发。合适和够用是最完美的追求。 个人网站:...

    kidsamong 评论0 收藏0
  • Laravel核心解读--异常处理

    摘要:请求未通过的验证时会抛出此异常。异常处理是非常重要但又容易让开发者忽略的功能,这篇文章简单解释了内部异常处理的机制以及扩展异常处理的方式方法。 异常处理是编程中十分重要但也最容易被人忽视的语言特性,它为开发者提供了处理程序运行时错误的机制,对于程序设计来说正确的异常处理能够防止泄露程序自身细节给用户,给开发者提供完整的错误回溯堆栈,同时也能提高程序的健壮性。 这篇文章我们来简单梳理一下...

    includecmath 评论0 收藏0
  • 如何优雅使用 laravel validator

    摘要:开发过程中经常会需要进行参数验证,中我们常用或者这两种方法来进行验证,但是这两种验证都不是很方便进行自定义提示信息,自定义验证规则,所以下面来介绍一种很方便的用法新建抽象类新建 web 开发过程中经常会需要进行参数验证,laravel 中我们常用 validator 或者 request 这两种方法来进行验证,但是这两种验证都不是很方便进行自定义提示信息,自定义验证规则,所以下面来介绍...

    quietin 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<