摘要:但是,這個響應的狀態(tài)碼,是。眾所周知的驗證器會拋出一個異常,此異常在被捕獲后會被的基異常處理器給渲染成響應判斷是否為請求也是在這里做的。
原文地址:https://prinzeugen.net/custom...
不得不說 Laravel 的 Validation 是極好的,非常易于使用,麻麻再也不用擔心我要寫一大堆驗證啦 ~( ^ω^)
但是這個 Validator 有一個神秘的地方 ( -д-),正如官方文檔所說,它會自動判斷當前請求是否為 Ajax 發(fā)送的,如果是,則在驗證失敗的時候返回一個 JsonResponse 響應而不是 RedirectResponse 響應。
但是,這個 JSON 響應的狀態(tài)碼,是 422。
WTF!坑爹呢這是!要知道 422 這個狀態(tài)碼是通不過 jQuery.ajax.success 的啊!
在網(wǎng)上找了一圈,愣是沒找著什么好一點的解決方法(全是叫你在 $.ajax.failed 里處理錯誤的)。
沒辦法,自己動手豐衣足食,總之先看看文檔:自定義閃存的錯誤消息格式
哦哦,看來我們可以在控制器基類中自定義錯誤的格式,于是我試著在 formatValidationErrors 方法中返回了一個狀態(tài)碼為 200 的 IlluminateHttpJsonResponse。但是這樣是行不通的,這個方法要求我們要返回一個數(shù)組,所以我們就不能使用這種小 trick 了(當然如果你愿意直接在這個方法里輸出 JSON 文本然后 exit 的話也沒事)。
既然這里沒辦法了,我們就得從 ExceptionHandler 下手了。眾所周知 Laravel 的驗證器會拋出一個 ValidationException 異常,此異常在被捕獲后會被 Laravel 的基異常處理器給渲染成 Http 響應(判斷是否為 Ajax 請求也是在這里做的)。
找到 Laravel 的基異常處理器 IlluminateFoundationExceptionsHandler 后,我們可以發(fā)現(xiàn)對于 ValidationException 這類的異常,Laravel 是直接從里面取出響應返回回去的。也就是說,具體的異常渲染是在 ValidationException 對象內(nèi)完成的:
/** * 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); } }
一顆賽艇!既然看到了希望,我們就繼續(xù)找下去。不過既然知道了 Laravel 原本的異常處理器是直接取出響應就輸出出去了,那我們就先看看這個取出來的 Response 到底是個啥:
class Handler extends ExceptionHandler { public function render($request, Exception $e) { if ($e instanceof ValidationException) { dd($e->getResponse()); } } }
這里我們用到了 Laravel 一票幫助函數(shù)中非常好用的一個函數(shù) —— dd(),這個函數(shù)的功能差不多就是一個漂亮的 var_dump() 加上 exit(),用來調(diào)試再方便不過了:
哦?這個方法得到的竟然是一個標準的 JsonResponse 響應!
既然是這樣,那我們就可以很方便的使用它的 setStatusCode 方法來設(shè)置其響應碼了。這個方法是繼承自 SymfonyComponentHttpFoundationResponse 的,有興趣的可以去讀一讀。
綜上所述,最后我們所需要做的就只是在 app/Exceptions/Handler.php 的 handle 方法中添加一個對于 ValidationException 的判斷:
if ($e instanceof ValidationException) { return $e->getResponse()->setStatusCode(200); }
結(jié)果如下:
謹以此文記錄,愿能幫到后來人~ (ゝ??)
當然你如果對于代碼的整潔沒那么多要求的話也用不著用這種方法就是了
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/30442.html
摘要:今天我來分享中層關(guān)于請求響應與表單驗證的知識。手動創(chuàng)建驗證請求之前的內(nèi)容是直接使用的方法來實現(xiàn)表單驗證。下一步到這篇為止,我完成了入門指南核心概念層的路由中間件控制器請求響應表單驗證的學習和整理。 showImg(https://segmentfault.com/img/remote/1460000010882838); 今天我來分享 Laravel 中 HTTP 層關(guān)于請求、響應與表...
摘要:通過業(yè)務處理異常,將不正常的業(yè)務處理結(jié)果返回給調(diào)用者或其他。通常會在層中寫與數(shù)據(jù)庫相關(guān)的代碼,如表的關(guān)聯(lián)關(guān)系,表屬性的可取值等。返回此類響應表示服務器拋出了未捕捉處理的異常或錯誤。 前言 之前在公司負責了一個項目,進行了前后端分離,筆者負責了整個項目的基本結(jié)構(gòu)的搭建,在此總結(jié)一些經(jīng)驗。本文主要介紹后端web api的設(shè)計與實現(xiàn)。demo代碼鏈接:github代碼 基本架構(gòu) 代碼分層 應...
摘要:個人網(wǎng)站最近剛寫了一個手機在線播放的電影站使用日常手記更新使用的的查詢作用域的本地作用域去自定義可復用的約束集合,方便鏈式調(diào)用什么是本地查詢作用域本地作用域允許我們定義通用的約束集合以便在應用中復用。 關(guān)于作者 程序開發(fā)人員,不拘泥于語言與技術(shù),目前主要從事PHP和前端開發(fā),使用Laravel和VueJs,App端使用Apicloud混合式開發(fā)。合適和夠用是最完美的追求。 個人網(wǎng)站:...
摘要:請求未通過的驗證時會拋出此異常。異常處理是非常重要但又容易讓開發(fā)者忽略的功能,這篇文章簡單解釋了內(nèi)部異常處理的機制以及擴展異常處理的方式方法。 異常處理是編程中十分重要但也最容易被人忽視的語言特性,它為開發(fā)者提供了處理程序運行時錯誤的機制,對于程序設(shè)計來說正確的異常處理能夠防止泄露程序自身細節(jié)給用戶,給開發(fā)者提供完整的錯誤回溯堆棧,同時也能提高程序的健壯性。 這篇文章我們來簡單梳理一下...
摘要:開發(fā)過程中經(jīng)常會需要進行參數(shù)驗證,中我們常用或者這兩種方法來進行驗證,但是這兩種驗證都不是很方便進行自定義提示信息,自定義驗證規(guī)則,所以下面來介紹一種很方便的用法新建抽象類新建 web 開發(fā)過程中經(jīng)常會需要進行參數(shù)驗證,laravel 中我們常用 validator 或者 request 這兩種方法來進行驗證,但是這兩種驗證都不是很方便進行自定義提示信息,自定義驗證規(guī)則,所以下面來介紹...
閱讀 2397·2021-10-09 09:44
閱讀 2132·2021-10-08 10:05
閱讀 3424·2021-07-26 23:38
閱讀 2991·2019-08-28 18:16
閱讀 812·2019-08-26 11:55
閱讀 1821·2019-08-23 18:29
閱讀 2035·2019-08-23 18:05
閱讀 1364·2019-08-23 17:02