婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 關于Laravel參數驗證的一些疑與惑

關于Laravel參數驗證的一些疑與惑

熱門標簽:天潤融通外呼系統好嗎 欣思維地圖標注 杭州語音電銷機器人 泊頭在哪里辦理400電話 電銷機器人沒有效果怎么樣 江西電銷機器人收費 高德地圖標注位置怎么標注 高德地圖標注店鋪收費嗎 江門回撥外呼系統

驗證器怎么創建的,誰創建的

Laravel 文檔調用驗證器,除了通過控制器,還有就是通過Facades的方式創建驗證器對象。Validator::make($data,$rule,$message)。

config/app.php 中注冊了'Validator' => Illuminate\Support\Facades\Validator::class。

?php

namespace Illuminate\Support\Facades;

/**
 * @see \Illuminate\Validation\Factory
 */
class Validator extends Facade
{
  /**
   * Get the registered name of the component.
   *
   * @return string
   */
  protected static function getFacadeAccessor()
  {
    return 'validator';
  }
}

從上面可以看出,Validator的實際實現類是容器中的validator對象,那這個validator對象是哪個?

?php

namespace Illuminate\Foundation;
...
class Application extends Container implements ApplicationContract, HttpKernelInterface
{
  ...
  public function registerCoreContainerAliases()
  {
    foreach ([
      ...
      'validator'=> [
        \Illuminate\Validation\Factory::class,
        \Illuminate\Contracts\Validation\Factory::class
      ],
    ])
    ...
  }
  ...
}

可以看出,最終創建驗證器是通過實現\Illuminate\Contracts\Validation\Factory接口的\Illuminate\Validation\Factory類創建的。再來看看,這個工廠類怎么創建實際的驗證器的。

//\Illuminate\Contracts\Validation\Factory 源碼

protected function resolve(array $data, array $rules, array $messages, array $customAttributes)
{
  if (is_null($this->resolver)) {
    return new Validator(
      $this->translator,
      $data,
      $rules,
      $messages,
      $customAttributes
    );
  }

  return call_user_func(
    $this->resolver,
    $this->translator,
    $data,
    $rules,
    $messages,
    $customAttributes
  );
}

到這里,可以看出Laravel的驗證器的創建都是通過特定的工廠類創建。

如果需要自定義驗證器類(比如我需要把5.8的一些新功能遷移到5.5的版本上),有兩種方式:

一,創建一個自定義的工廠類。然后在AppServiceProvider中重新綁定新的驗證器工廠創建類;

二,AppServiceProvider中通過resolver方法設置工廠類的resolver屬性,接管驗證器的實例化,例如:

Validator::resolver(function($translator, $data, $rules, $messages, $customAttributes){
  return new ExtendValidator($translator, $data, $rules, $messages, $customAttributes);
});

如何自定義驗證規則

Laravel本身提供了很多通用的參數驗證規則,但是對于一些特定的場景,還是需要提供驗證規則的擴展。

Laravel驗證規則的擴展有兩種方式。

1 通過extend方法擴展

//這是一個簡單的參數比較的驗證規則,Laravel5.8中提供,Laravel5.5中未提供
//驗證規則如下: 'max_num'=>'gte:min',
Validator::extend('gte',function($attribute, $value, $parameters, $validator){
  if($value>=data_get($validator->getData(),$parameters[0]))
  {
    return true;
  }
  return false;
});
//\Illuminate\Contracts\Validation\Factory 源碼
public function extend($rule, $extension, $message = null)
{
  $this->extensions[$rule] = $extension;

  if ($message) {
    $this->fallbackMessages[Str::snake($rule)] = $message;
  }
}
//\Illuminate\Validation\Validator 源碼
protected function callExtension($rule, $parameters)
{
  $callback = $this->extensions[$rule];

  if (is_callable($callback)) {
    return call_user_func_array($callback, $parameters);
  } elseif (is_string($callback)) {
    return $this->callClassBasedExtension($callback, $parameters);
  }
}

protected function validateAttribute($attribute, $rule)
{
  ...
  $method = "validate{$rule}";
  if ($validatable  ! $this->$method($attribute, $value, $parameters, $this)) {
    $this->addFailure($attribute, $rule, $parameters);
  }
}

public function __call($method, $parameters)
{
  $rule = Str::snake(substr($method, 8));

  if (isset($this->extensions[$rule])) {
    return $this->callExtension($rule, $parameters);
  }

  throw new BadMethodCallException(sprintf(
    'Method %s::%s does not exist.', static::class, $method
  ));
}

Factory提供了extend方法用于擴展規則驗證方法。所有的擴展規則最終都會被傳到驗證器中。驗證器在驗證參數的過程中,如果找到匹配的驗證規則,則直接進行驗證。否則調用魔術方法__call查找擴展驗證函數。擴展函數返回布爾值,返回true則表示驗證通過,返回false表示驗證失敗。

2 通過自定義規則類擴展

Laravel 中提供了Illuminate\Contracts\Validation\Rule接口,只有實現了這個接口的類都認為是符合的自定義驗證規則類。

?php

namespace Illuminate\Contracts\Validation;

interface Rule
{
  /**
   * Determine if the validation rule passes.
   *
   * @param string $attribute
   * @param mixed $value
   * @return bool
   */
  public function passes($attribute, $value);

  /**
   * Get the validation error message.
   *
   * @return string
   */
  public function message();
}

自定義規則類需要實現的方法有passes方法,用于驗證參數是否合法。message方法,用于提供驗證失敗的錯誤提示信息。

使用自定義驗證類,相對于extend方法擴展有一個很大的bug就是無法在自定義類中獲取到當期的驗證器對象。從而導致在當前擴展的驗證規則中,只能過獲取到需要驗證的數據,而獲取不到其他的字段數據,無法進行聯合字段的驗證。像上面比較兩個字段的大小的驗證規則就無法實現。

如果想要通過自定義驗證規則類實現上面兩個字段大小比較的驗證規則,則需要自定義驗證類,修改validateUsingCustomRule方法,將當期驗證器傳入到自定義驗證規則實例對象中去。

protected function validateUsingCustomRule($attribute, $value, $rule)
{
  if(method_exists($rule, 'setValidator'))
  {
    $rule->setValidator($this);
  }
  return parent::validateUsingCustomRule($attribute,$value,$rule);
}

如何實現用當期類方法作為驗證規則驗證函數

像Yii2中,因為基本上所有的對象都有驗證方法,所以很容易用當期類方法作為驗證規則驗證函數。

例如,一個驗證規則如下,表示用當期類的validateMinNum對參數進行驗證,那么,這樣的一個功能,如何在Laravel中實現呢。

['min_num'=>'validateMinNum']

方法1 通過自定義類實現 Laravel提供了ClosureValidationRule自定義驗證類,用來添加回調函數的驗證。

例如

$rule = [
  'min'=>new ClosureValidationRule([$this,'checkv'])
];
$data = ['min'=>10];
$v = Validator::make($data,$rule);

方法2 通過extend方式實現

$rule = [
  'min'=>'checkv'
];
Validator::extend('checkv',[$this,'checkv']);

但是這種方式對驗證器的影響是全局的。不建議使用。

總結

通過以上源碼的學習,可以看出Laravel驗證器的創建都是用過驗證器工廠類創建的。如果需要自定義驗證器,可以通過修改驗證器工廠類,或者設置驗證器工廠類的resolver屬性接管驗證器的實例化。

驗證規則的擴展有兩種方式,一種是通過extend方式實現。extend方式對驗證器的影響是全局的,整個運行進程有效。可以獲取到驗證器本身,因此可以做多個字段關系的驗證;另一種是通過自定義規則類實現。自定義規則了只對使用自定義規則類的驗證有效。但是自定義規則類本身無法直接獲取到驗證器本身,不能夠做多個字段關系的驗證。如果需要實現,則需要使用自定義驗證器,將驗證器傳入到驗證規則中去。

Laravel本身提供了ClosureValidationRule的驗證規則用于處理回調函數驗證規則。同時也可以使用extend方式進行回調函數的驗證。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • Laravel框架表單驗證詳解
  • Laravel中使用FormRequest進行表單驗證方法及問題匯總
  • 在Laravel框架里實現發送郵件實例(郵箱驗證)
  • Laravel框架實現發送短信驗證功能代碼
  • Laravel 5框架學習之表單驗證
  • Laravel4中的Validator驗證擴展用法詳解
  • 使用 laravel sms 構建短信驗證碼發送校驗功能
  • Laravel中unique和exists驗證規則的優化詳解
  • Laravel框架用戶登陸身份驗證實現方法詳解
  • Laravel5.2使用Captcha生成驗證碼實現登錄(session巨坑)

標簽:江門 平涼 駐馬店 雙鴨山 內江 石嘴山 大同 深圳

巨人網絡通訊聲明:本文標題《關于Laravel參數驗證的一些疑與惑》,本文關鍵詞  關于,Laravel,參數,驗證,的,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《關于Laravel參數驗證的一些疑與惑》相關的同類信息!
  • 本頁收集關于關于Laravel參數驗證的一些疑與惑的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    日韩精品中午字幕| 中文字幕在线免费不卡| 欧美中文字幕一区二区三区亚洲| 91丝袜美腿高跟国产极品老师 | 丝袜亚洲另类丝袜在线| 视频在线观看91| 国产在线视频一区二区| 国产成人午夜高潮毛片| 色噜噜偷拍精品综合在线| 欧美日韩一级片网站| 欧美一区二区三区播放老司机| 久久综合色天天久久综合图片| 久久亚洲精品小早川怜子| 亚洲欧美电影院| 视频一区二区国产| 成人激情午夜影院| 91麻豆精品国产91久久久使用方法 | 一区二区三区四区精品在线视频| 亚洲成人精品在线观看| 极品美女销魂一区二区三区免费| 国产乱理伦片在线观看夜一区 | 国产精品18久久久久久久久久久久 | 亚洲欧美激情在线| 免费人成精品欧美精品 | 精品国产凹凸成av人网站| 亚洲欧洲一区二区在线播放| 日韩激情视频在线观看| 天天操天天干天天综合网| www.欧美色图| 欧美电影免费观看高清完整版在 | 秋霞国产午夜精品免费视频| 在线观看一区二区视频| 亚洲欧美成aⅴ人在线观看| 蜜臀av一区二区在线免费观看| 波多野结衣在线aⅴ中文字幕不卡| 欧美男生操女生| 国产精品久久久久久久久免费樱桃| 日本午夜精品视频在线观看| 91色在线porny| 日本一区二区三区在线观看| 日本在线不卡一区| 欧美日韩午夜精品| 日本一区二区成人| 国产成人免费在线观看不卡| 欧美一级xxx| 亚洲成人免费视频| 欧美综合一区二区| 日韩理论片一区二区| 国产成a人无v码亚洲福利| 精品乱人伦一区二区三区| 日韩成人一级大片| 7777精品伊人久久久大香线蕉超级流畅 | 不卡区在线中文字幕| 国产亚洲1区2区3区| 激情丁香综合五月| 国产午夜一区二区三区| 国产一区二区久久| 精品国产亚洲一区二区三区在线观看| 婷婷综合另类小说色区| 欧美日韩亚洲国产综合| 日日摸夜夜添夜夜添国产精品| 欧美色中文字幕| 亚洲一区二区av在线| 一本色道亚洲精品aⅴ| 中文字幕亚洲一区二区av在线| 懂色一区二区三区免费观看| 国产精品久久久久婷婷二区次| 丁香六月久久综合狠狠色| 久久久久久97三级| 91亚洲大成网污www| 亚洲在线中文字幕| 欧美一级免费大片| 精品亚洲欧美一区| 国产亚洲一二三区| 99riav久久精品riav| 亚洲国产成人高清精品| 欧美一区二区黄色| 国产伦精品一区二区三区免费| 欧美韩国一区二区| 在线一区二区视频| 蜜桃av一区二区三区电影| www国产精品av| 成人一区在线看| 亚洲成人免费视| 久久久久久久久蜜桃| 91视频观看视频| 日本午夜精品视频在线观看| 国产欧美一区二区三区鸳鸯浴| 一本大道综合伊人精品热热| 日韩在线一区二区三区| 久久久噜噜噜久久中文字幕色伊伊| 91丨九色丨蝌蚪丨老版| 秋霞成人午夜伦在线观看| 国产精品日韩成人| 欧美电影一区二区| 成人福利视频在线| 日本怡春院一区二区| 亚洲欧美偷拍三级| 欧美xxxxxxxxx| 欧美日韩精品欧美日韩精品一| 国产在线精品国自产拍免费| 亚洲精品免费看| 久久综合久久久久88| 欧美性感一区二区三区| 成人av免费在线观看| 蜜臂av日日欢夜夜爽一区| 一区二区三区免费网站| 久久久国产精华| 欧美日韩视频在线一区二区| 不卡影院免费观看| 国内久久精品视频| 亚洲成人免费视频| 亚洲精品菠萝久久久久久久| 日本一区免费视频| 精品久久久久久最新网址| 欧美日韩一区二区在线观看视频 | 久久久国产精华| 欧美疯狂做受xxxx富婆| 91啦中文在线观看| 岛国精品在线观看| 国产另类ts人妖一区二区| 秋霞电影一区二区| 视频一区中文字幕国产| 亚洲国产精品天堂| 一区二区三区av电影| 国产精品午夜免费| 国产偷v国产偷v亚洲高清| 欧美v日韩v国产v| 欧美一区二区三区爱爱| 欧美日韩一级二级三级| 欧美亚日韩国产aⅴ精品中极品| 99久久伊人精品| 91色婷婷久久久久合中文| 99久久精品久久久久久清纯| 成人激情电影免费在线观看| 国内不卡的二区三区中文字幕 | 国产精品不卡在线观看| 日本一区二区免费在线| 日本一二三不卡| 国产欧美精品区一区二区三区| 精品少妇一区二区三区日产乱码| 91精品国产乱码| 日韩欧美国产三级电影视频| 日韩欧美一级二级| 欧美成人一区二区三区片免费 | 欧美一卡2卡三卡4卡5免费| 欧美夫妻性生活| 日韩欧美国产综合| 欧美tickling挠脚心丨vk| 日韩欧美高清在线| 精品sm捆绑视频| 欧美国产一区在线| 欧美国产日韩a欧美在线观看| 国产精品嫩草影院av蜜臀| 亚洲乱码一区二区三区在线观看| 一区二区免费视频| 香蕉久久一区二区不卡无毒影院 | 欧美日韩aaaaaa| 欧美一区二区三区四区在线观看| 日韩色视频在线观看| 久久久99久久精品欧美| 中文字幕亚洲成人| 一区二区三区日韩欧美| 免费人成黄页网站在线一区二区| 国产精品一级黄| 91官网在线免费观看| 欧美精品视频www在线观看| 日韩精品在线一区二区| 久久欧美中文字幕| 一区二区三区精品视频| 久久av资源站| 一本色道亚洲精品aⅴ| 欧美大片一区二区| 亚洲视频在线观看一区| 蜜臀av在线播放一区二区三区| 国产精品香蕉一区二区三区| 色爱区综合激月婷婷| 日韩免费电影网站| 亚洲色欲色欲www| 免费观看日韩av| 99麻豆久久久国产精品免费优播| 7777精品伊人久久久大香线蕉最新版| 亚洲精品一线二线三线| 夜夜嗨av一区二区三区网页| 国产精品一区二区视频| 欧美丰满嫩嫩电影| 中文字幕亚洲成人| 久久国产精品色婷婷| 色播五月激情综合网| 欧美一区二区日韩一区二区| 亚洲欧洲综合另类在线 | 欧美一区二区三区色| 自拍偷自拍亚洲精品播放| 久久不见久久见中文字幕免费| 91福利资源站| 国产精品免费视频观看| 久久国产福利国产秒拍| 欧美日韩国产a| 一区二区视频免费在线观看| 粉嫩绯色av一区二区在线观看|