摘要:我們有時會碰到一個場景,比如買車票,需要進行查詢車票剩余,這時候需要一個日期范圍,開始日期必須大于等于今天,結束日期必須大于等于開始日期。通過增加一個額外的字段,然后通過這個字段限制范圍。測試發現實際并不生效。
我們有時會碰到一個場景,比如買車票,需要進行查詢車票剩余,這時候需要一個日期范圍,開始日期必須大于等于今天,結束日期必須大于等于開始日期。
VersionLaravel 5.5.40
PHP 7.1
開始之前,為方便查看結果,在/Exceptions/Handler.php文件捕獲了異常
那么我們開始做一個驗證吧:
新建一個request并注入到需要驗證控制器的方法
下圖圈出的紅色部分,需改成return true因為我們身份驗證一般不在這里驗證
如上圖,end_date可以很簡單的通過start_date來限制時間范圍,那么start_date該怎么驗證呢?我本來想的是這樣的。
通過增加一個額外的字段curr_date,然后start_date通過這個字段限制范圍。測試發現實際并不生效。直接進入了控制器打印的數據
調試了一下,我在IlluminateValidationConcerns、ValidatesAttributes::validateAfterOrEqual方法跳到compareDates方法,并嘗試打印了$this->getValue($parameters[0])這時候的$paramters[0]為curr_date總是null
然后查閱了一下源碼,知道了原因,直接說能正確驗證的方法,再說詳細的過程。
正確的方法是這樣的
重寫父類的prepareForValidation方法,之后再測試
這時候得到想要的驗證了
分析一下過程
能通過依賴注入實例化我們想要的對象,這一切都得感謝Laravel的IoC容器
容器每次解析完新對象之后,總是會釋放一些綁定的事件
這些事件很多都是通過服務提供者來綁定的,我們直接查看config/app.php里有關表單驗證的服務提供者
我們可以看到當實現ValidatesWhenResolved對象的類在解析之后會自動調用validate方法
回到新建的IndexTicketRequest類,沒有這個方法,去到父類,發現實現了ValidatesWhenResolved,而validate是在trait的ValidatesWhenResolvedTrait
這個類找到了答案,在validate方法里分三步主要的
$this->prepareForValidation() 在驗證之前的準備
新建一個驗證實例
開始驗證
之所以是需要在驗證之前設置curr_date,我們來看看新建驗證實例便知道答案
這里有一個地方導致我們的問題出現,就是先調用了$this->validationData()方法拿到request的數據,然后再通過$this->container->call([$this, "rules"])拿到驗證規則,所以我們在rules方法寫的自然不生效了,之后的驗證便無法繼續進行
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30893.html
摘要:弊端顯而易見,如果另一個不是就抓瞎了,下面是另一種通用的解決方案在中重寫方法假設字段是假設字段是假設字段是可以看到雖然能解決問題,但是顯然有悖于的優雅風格,賣了這么多關子,下面跟大家分享一下我的解決方案。 解決方案: 登錄字段不超過兩個的(簡單的解決方案) 登錄字段大于或等于三個的(相對復雜一些) 登錄字段不超過兩個的 我在網上看到一種相對簡單解決方案,但是不能解決所有兩個字段的驗...
摘要:用于對接口的請求參數進行合法性檢查。唯一不符合這一規則的是字符串型驗證器,它們一部分以開頭的,但也有一部分不以開頭,比如等。驗證型參數型驗證器只有兩個合法的取值為字符串忽略大小寫。合法的取值為字符串忽略大小寫例完整的型驗證器的列表參考附錄。 用于對API接口的請求參數進行合法性檢查。 在實現服務端的API接口時,對于每一個接口的每一個參數,都應該檢測其取值是否合法,以免錯誤的數據輸入到...
摘要:個人網站最近剛寫了一個手機在線播放的電影站使用日常手記更新使用的的查詢作用域的本地作用域去自定義可復用的約束集合,方便鏈式調用什么是本地查詢作用域本地作用域允許我們定義通用的約束集合以便在應用中復用。 關于作者 程序開發人員,不拘泥于語言與技術,目前主要從事PHP和前端開發,使用Laravel和VueJs,App端使用Apicloud混合式開發。合適和夠用是最完美的追求。 個人網站:...
摘要:最優就只能是查詢表的數量才算是比較合理,完全有足夠的能力寫出優雅的代碼很多人可能會想到的原生查詢了么。但是有強大的關聯,訪問器修改,查詢范圍等等這些功能讓你的代碼非常簡潔。相信熟悉的人已經知道怎么查詢了,可以達到最優化的,和最優雅的寫法。 終于被產品的各種刁鉆不合常理的需求磨煉出用laravel寫出較為優雅的代碼,在這里給大家分享一下。 先簡單介紹一下基本環境,我們是做一款直播APP的...
摘要:小紅要以最低成本最快速度推出版本,投放市場,收集反饋,持續迭代。總結在技能掌握充足的情況下,個人感覺開發效率要略高于。 我個人是比較不喜歡去正兒八經的比較兩個框架的,這樣沒有意義,不過欲善其事先利其器! 技術是相通的,但是在某個特定的領域的某個階段肯定有相對最適合的一個工具! 這里比較不是從技術角度比較,而是從公司技術選型考慮的,特別是初創的互聯網創業公司。沒辦法,誰讓互聯網公司離不開...
閱讀 1079·2021-11-16 11:44
閱讀 1368·2019-08-30 13:12
閱讀 2401·2019-08-29 16:05
閱讀 3070·2019-08-28 18:29
閱讀 904·2019-08-26 13:41
閱讀 3228·2019-08-26 13:34
閱讀 2596·2019-08-26 10:35
閱讀 931·2019-08-26 10:28