亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

關(guān)于Laravel參數(shù)驗(yàn)證的一些疑與惑

 更新時(shí)間:2019年11月19日 08:31:10   作者:寫PHP的老王  
這篇文章主要給大家介紹了關(guān)于Laravel參數(shù)驗(yàn)證的一些疑與惑,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Laravel具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

驗(yàn)證器怎么創(chuàng)建的,誰創(chuàng)建的

Laravel 文檔調(diào)用驗(yàn)證器,除了通過控制器,還有就是通過Facades的方式創(chuàng)建驗(yàn)證器對象。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的實(shí)際實(shí)現(xiàn)類是容器中的validator對象,那這個(gè)validator對象是哪個(gè)?

<?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
      ],
    ])
    ...
  }
  ...
}

可以看出,最終創(chuàng)建驗(yàn)證器是通過實(shí)現(xiàn)\Illuminate\Contracts\Validation\Factory接口的\Illuminate\Validation\Factory類創(chuàng)建的。再來看看,這個(gè)工廠類怎么創(chuàng)建實(shí)際的驗(yàn)證器的。

//\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的驗(yàn)證器的創(chuàng)建都是通過特定的工廠類創(chuàng)建。

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

一,創(chuàng)建一個(gè)自定義的工廠類。然后在AppServiceProvider中重新綁定新的驗(yàn)證器工廠創(chuàng)建類;

二,AppServiceProvider中通過resolver方法設(shè)置工廠類的resolver屬性,接管驗(yàn)證器的實(shí)例化,例如:

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

如何自定義驗(yàn)證規(guī)則

Laravel本身提供了很多通用的參數(shù)驗(yàn)證規(guī)則,但是對于一些特定的場景,還是需要提供驗(yàn)證規(guī)則的擴(kuò)展。

Laravel驗(yàn)證規(guī)則的擴(kuò)展有兩種方式。

1 通過extend方法擴(kuò)展

//這是一個(gè)簡單的參數(shù)比較的驗(yàn)證規(guī)則,Laravel5.8中提供,Laravel5.5中未提供
//驗(yàn)證規(guī)則如下: '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方法用于擴(kuò)展規(guī)則驗(yàn)證方法。所有的擴(kuò)展規(guī)則最終都會被傳到驗(yàn)證器中。驗(yàn)證器在驗(yàn)證參數(shù)的過程中,如果找到匹配的驗(yàn)證規(guī)則,則直接進(jìn)行驗(yàn)證。否則調(diào)用魔術(shù)方法__call查找擴(kuò)展驗(yàn)證函數(shù)。擴(kuò)展函數(shù)返回布爾值,返回true則表示驗(yàn)證通過,返回false表示驗(yàn)證失敗。

2 通過自定義規(guī)則類擴(kuò)展

Laravel 中提供了Illuminate\Contracts\Validation\Rule接口,只有實(shí)現(xiàn)了這個(gè)接口的類都認(rèn)為是符合的自定義驗(yàn)證規(guī)則類。

<?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();
}

自定義規(guī)則類需要實(shí)現(xiàn)的方法有passes方法,用于驗(yàn)證參數(shù)是否合法。message方法,用于提供驗(yàn)證失敗的錯(cuò)誤提示信息。

使用自定義驗(yàn)證類,相對于extend方法擴(kuò)展有一個(gè)很大的bug就是無法在自定義類中獲取到當(dāng)期的驗(yàn)證器對象。從而導(dǎo)致在當(dāng)前擴(kuò)展的驗(yàn)證規(guī)則中,只能過獲取到需要驗(yàn)證的數(shù)據(jù),而獲取不到其他的字段數(shù)據(jù),無法進(jìn)行聯(lián)合字段的驗(yàn)證。像上面比較兩個(gè)字段的大小的驗(yàn)證規(guī)則就無法實(shí)現(xiàn)。

如果想要通過自定義驗(yàn)證規(guī)則類實(shí)現(xiàn)上面兩個(gè)字段大小比較的驗(yàn)證規(guī)則,則需要自定義驗(yàn)證類,修改validateUsingCustomRule方法,將當(dāng)期驗(yàn)證器傳入到自定義驗(yàn)證規(guī)則實(shí)例對象中去。

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

如何實(shí)現(xiàn)用當(dāng)期類方法作為驗(yàn)證規(guī)則驗(yàn)證函數(shù)

像Yii2中,因?yàn)榛旧纤械膶ο蠖加序?yàn)證方法,所以很容易用當(dāng)期類方法作為驗(yàn)證規(guī)則驗(yàn)證函數(shù)。

例如,一個(gè)驗(yàn)證規(guī)則如下,表示用當(dāng)期類的validateMinNum對參數(shù)進(jìn)行驗(yàn)證,那么,這樣的一個(gè)功能,如何在Laravel中實(shí)現(xiàn)呢。

['min_num'=>'validateMinNum']

方法1 通過自定義類實(shí)現(xiàn) Laravel提供了ClosureValidationRule自定義驗(yàn)證類,用來添加回調(diào)函數(shù)的驗(yàn)證。

例如

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

方法2 通過extend方式實(shí)現(xiàn)

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

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

總結(jié)

通過以上源碼的學(xué)習(xí),可以看出Laravel驗(yàn)證器的創(chuàng)建都是用過驗(yàn)證器工廠類創(chuàng)建的。如果需要自定義驗(yàn)證器,可以通過修改驗(yàn)證器工廠類,或者設(shè)置驗(yàn)證器工廠類的resolver屬性接管驗(yàn)證器的實(shí)例化。

驗(yàn)證規(guī)則的擴(kuò)展有兩種方式,一種是通過extend方式實(shí)現(xiàn)。extend方式對驗(yàn)證器的影響是全局的,整個(gè)運(yùn)行進(jìn)程有效??梢垣@取到驗(yàn)證器本身,因此可以做多個(gè)字段關(guān)系的驗(yàn)證;另一種是通過自定義規(guī)則類實(shí)現(xiàn)。自定義規(guī)則了只對使用自定義規(guī)則類的驗(yàn)證有效。但是自定義規(guī)則類本身無法直接獲取到驗(yàn)證器本身,不能夠做多個(gè)字段關(guān)系的驗(yàn)證。如果需要實(shí)現(xiàn),則需要使用自定義驗(yàn)證器,將驗(yàn)證器傳入到驗(yàn)證規(guī)則中去。

Laravel本身提供了ClosureValidationRule的驗(yàn)證規(guī)則用于處理回調(diào)函數(shù)驗(yàn)證規(guī)則。同時(shí)也可以使用extend方式進(jìn)行回調(diào)函數(shù)的驗(yàn)證。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Laravel中encrypt和decrypt的實(shí)現(xiàn)方法

    Laravel中encrypt和decrypt的實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于Laravel中encrypt和decrypt的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • PHP實(shí)現(xiàn)微信申請退款流程實(shí)例代碼

    PHP實(shí)現(xiàn)微信申請退款流程實(shí)例代碼

    本篇文章給大家介紹php實(shí)現(xiàn)微信申請退款流程,使用到官方提供的SDK中的最重要的一個(gè)類文件WxPay.Api.php中提供的refund()方法來實(shí)現(xiàn)的,完整大家大家參考下本文
    2018-03-03
  • Thinkphp 框架擴(kuò)展之驅(qū)動擴(kuò)展實(shí)例分析

    Thinkphp 框架擴(kuò)展之驅(qū)動擴(kuò)展實(shí)例分析

    這篇文章主要介紹了Thinkphp 框架擴(kuò)展之驅(qū)動擴(kuò)展,結(jié)合實(shí)例形式分析了Thinkphp 框架驅(qū)動擴(kuò)展相關(guān)原理、實(shí)現(xiàn)方法及操作注意事項(xiàng),需要的朋友可以參考下
    2020-04-04
  • Laravel實(shí)現(xiàn)用戶多字段認(rèn)證的解決方法

    Laravel實(shí)現(xiàn)用戶多字段認(rèn)證的解決方法

    最近在工作中遇到一個(gè)問題,需要多字段的驗(yàn)證,通過查找相關(guān)資料終于解決了,下面這篇文章主要給大家介紹了關(guān)于Laravel如何實(shí)現(xiàn)用戶多字段認(rèn)證的解決方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們可以參考借鑒,下面來一起看看吧。
    2017-09-09
  • php使用filter過濾器驗(yàn)證郵箱 ipv6地址 url驗(yàn)證

    php使用filter過濾器驗(yàn)證郵箱 ipv6地址 url驗(yàn)證

    原來判斷郵箱、url和ip地址格式是否符合都是用正則表達(dá)式。后來才知道在php中也可以使用內(nèi)置的函數(shù)庫filter來完成這些功能,下面分享給大家
    2013-12-12
  • php獲取訪問者IP地址匯總

    php獲取訪問者IP地址匯總

    在很我的時(shí)候我們需要得到用戶的真實(shí)IP地址,例如,日志記錄,地理定位,將用戶信息,網(wǎng)站數(shù)據(jù)分析等,其實(shí)獲取IP地址很簡單$_SERVER[\'REMOTE_ADDR\']就可以了。下面我們就來給大家匯總一下常用的幾種獲取IP地址的方法。
    2015-04-04
  • thinkPHP3.2.3實(shí)現(xiàn)阿里大于短信驗(yàn)證的方法

    thinkPHP3.2.3實(shí)現(xiàn)阿里大于短信驗(yàn)證的方法

    這篇文章主要介紹了thinkPHP3.2.3實(shí)現(xiàn)阿里大于短信驗(yàn)證的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-06-06
  • php實(shí)現(xiàn)搜索類封裝示例

    php實(shí)現(xiàn)搜索類封裝示例

    這篇文章主要為大家詳細(xì)介紹了php實(shí)現(xiàn)搜索類封裝示例,感興趣的小伙伴們可以參考一下
    2016-03-03
  • PHP之正則表達(dá)式捕獲組與非捕獲組(詳解)

    PHP之正則表達(dá)式捕獲組與非捕獲組(詳解)

    這篇文章主要介紹了php之正則表達(dá)式捕獲組與非捕獲組的詳細(xì)介紹,需要的朋友可以參考下
    2015-07-07
  • ThinkPHP使用Smarty第三方插件方法小結(jié)

    ThinkPHP使用Smarty第三方插件方法小結(jié)

    這篇文章主要介紹了ThinkPHP使用Smarty第三方插件方法,結(jié)合實(shí)例形式總結(jié)分析了ThinkPHP使用Smarty模板的具體步驟與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2016-03-03

最新評論