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