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

為你的 Laravel 驗(yàn)證器加上多驗(yàn)證場(chǎng)景的實(shí)現(xiàn)

 更新時(shí)間:2020年04月07日 15:30:16   作者:割了動(dòng)脈喝脈動(dòng)  
這篇文章主要介紹了為你的 Laravel 驗(yàn)證器加上多驗(yàn)證場(chǎng)景的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

在我們使用 laravel 框架的驗(yàn)證器,有的時(shí)候需要對(duì)表單等進(jìn)行數(shù)據(jù)驗(yàn)證,當(dāng)然 laravel 也為我們提供了
Illuminate\Http\Request 對(duì)象提供的 validate 方法 以及 FormRequest 和 Validator。

FormRequest 通過(guò)新建文件將我們的驗(yàn)證部分單獨(dú)分開(kāi),來(lái)避免控制器臃腫。如果驗(yàn)證失敗,就會(huì)生成一個(gè)讓用戶返回到先前的位置的重定向響應(yīng)。這些錯(cuò)誤也會(huì)被閃存到 Session 中,以便這些錯(cuò)誤都可以在頁(yè)面中顯示出來(lái)。如果傳入的請(qǐng)求是 AJAX,會(huì)向用戶返回具有 422 狀態(tài)代碼和驗(yàn)證錯(cuò)誤信息的 JSON 數(shù)據(jù)的 HTTP 響應(yīng)。如果是接口請(qǐng)求或 ajax, 那么我們可能還需要將返回的 json 數(shù)據(jù)修改成我們想要的格式。

當(dāng)我們實(shí)際開(kāi)發(fā)中,可能一個(gè)模塊需要有多個(gè)驗(yàn)證場(chǎng)景,如果為每一個(gè)驗(yàn)證場(chǎng)景都新建一個(gè) FormRequest 不就太過(guò)繁瑣了。
那么給 laravel 加上一個(gè)驗(yàn)證場(chǎng)景通過(guò)一個(gè)驗(yàn)證類一個(gè)模塊或多個(gè)模塊來(lái)適應(yīng)不同的場(chǎng)景不就方便很多了。

開(kāi)始

首先 我們封裝了一個(gè)基類 BaseValidate.php 并將其放在 app\Validate 下,當(dāng)然你也可以放在其他地方,只要修改好命名空間就好。

<?php
namespace App\Validate;

use Illuminate\Support\Facades\Validator;
/**
 * 擴(kuò)展驗(yàn)證器
 */
class BaseValidate {

  /**
   * 當(dāng)前驗(yàn)證規(guī)則
   * @var array
   */
  protected $rule = [];

  /**
   * 驗(yàn)證提示信息
   * @var array
   */
  protected $message = [];

  /**
   * 驗(yàn)證場(chǎng)景定義
   * @var array
   */
  protected $scene = [];

  /**
   * 設(shè)置當(dāng)前驗(yàn)證場(chǎng)景
   * @var array
   */
  protected $currentScene = null;

  /**
   * 驗(yàn)證失敗錯(cuò)誤信息
   * @var array
   */
  protected $error = [];

  /**
   * 場(chǎng)景需要驗(yàn)證的規(guī)則
   * @var array
   */
  protected $only = [];


  /**
   * 設(shè)置驗(yàn)證場(chǎng)景
   * @access public
   * @param string $name 場(chǎng)景名
   * @return $this
   */
  public function scene($name)
  {
    // 設(shè)置當(dāng)前場(chǎng)景
    $this->currentScene = $name;

    return $this;
  }

  /**
   * 數(shù)據(jù)驗(yàn)證
   * @access public
   * @param array   $data 數(shù)據(jù)
   * @param mixed   $rules 驗(yàn)證規(guī)則
   * @param array  $message 自定義驗(yàn)證信息
   * @param string  $scene 驗(yàn)證場(chǎng)景
   * @return bool
   */
  public function check($data, $rules = [], $message = [],$scene = '')
  {
    $this->error =[];
    if (empty($rules)) {
      //讀取驗(yàn)證規(guī)則
      $rules = $this->rule;
    }
    if (empty($message)) {
      $message = $this->message;
    }

    //讀取場(chǎng)景
    if (!$this->getScene($scene)) {
      return false;
    }

    //如果場(chǎng)景需要驗(yàn)證的規(guī)則不為空
    if (!empty($this->only)) {
      $new_rules = [];
      foreach ($this->only as $key => $value) {
        if (array_key_exists($value,$rules)) {
          $new_rules[$value] = $rules[$value];
        }  
      }
      $rules = $new_rules;
    }
    // var_dump($rules);die;
    $validator = Validator::make($data,$rules,$message);
    //驗(yàn)證失敗
    if ($validator->fails()) {
      $this->error = $validator->errors()->first();
      return false;
    }

    return !empty($this->error) ? false : true;
  }

  /**
   * 獲取數(shù)據(jù)驗(yàn)證的場(chǎng)景
   * @access protected
   * @param string $scene 驗(yàn)證場(chǎng)景
   * @return void
   */
  protected function getScene($scene = '')
  {
    if (empty($scene)) {
      // 讀取指定場(chǎng)景
      $scene = $this->currentScene;
    }
    $this->only = [];

    if (empty($scene)) {
      return true;
    }

    if (!isset($this->scene[$scene])) {
      //指定場(chǎng)景未找到寫入error
      $this->error = "scene:".$scene.'is not found';
      return false;
    }
    // 如果設(shè)置了驗(yàn)證適用場(chǎng)景
    $scene = $this->scene[$scene];
    if (is_string($scene)) {
      $scene = explode(',', $scene);
    }
    //將場(chǎng)景需要驗(yàn)證的字段填充入only
    $this->only = $scene;
    return true;
  }

  // 獲取錯(cuò)誤信息
  public function getError()
  {
    return $this->error;
  } 
}

使用

接下來(lái)我們來(lái)驗(yàn)證一個(gè)文章的提交信息,首先我們新建一個(gè)文章驗(yàn)證類 ArticleValidate.php 并填充一些內(nèi)容

<?php
namespace App\Validate;

use App\Validate\BaseValidate;
/**
 * 文章驗(yàn)證器
 */
class ArticleValidate extends BaseValidate {
  //驗(yàn)證規(guī)則
  protected $rule =[
    'id'=>'required',
    'title' => 'required|max:255',
    'content' => 'required',
  ];
  //自定義驗(yàn)證信息
  protected $message = [
    'id.required'=>'缺少文章id',
    'title.required'=>'請(qǐng)輸入title',
    'title.max'=>'title長(zhǎng)度不能大于 255',
    'content.required'=>'請(qǐng)輸入內(nèi)容',
  ];

  //自定義場(chǎng)景
  protected $scene = [
    'add'=>"title,content",
    'edit'=> ['id','title','content'],
  ];
}

如上所示,在這個(gè)類中我們定義了驗(yàn)證規(guī)則 rule,自定義驗(yàn)證信息 message,以及驗(yàn)證場(chǎng)景 scene

非場(chǎng)景驗(yàn)證

我們只需要定義好規(guī)則

public function update(){

    $ArticleValidate = new ArticleValidate;

    $request_data = [
      'id'=>'1',
      'title'=>'我是文章的標(biāo)題',
      'content'=>'我是文章的內(nèi)容',
    ];

    if (!$ArticleValidate->check($request_data)) {
      var_dump($ArticleValidate->getError());
    }
  }

check 方法中總共有四個(gè)參數(shù),第一個(gè)要驗(yàn)證的數(shù)據(jù),第二個(gè)驗(yàn)證規(guī)則,第三個(gè)自定義錯(cuò)誤信息,第四個(gè)驗(yàn)證場(chǎng)景,其中 2,3,4 非必傳。
如果驗(yàn)證未通過(guò)我們調(diào)用 getError() 方法來(lái)輸出錯(cuò)誤信息,getError()暫不支持返回所有驗(yàn)證錯(cuò)誤信息 。

場(chǎng)景驗(yàn)證

我們需要提前在驗(yàn)證類中定義好驗(yàn)證場(chǎng)景

如下,支持使用字符串或數(shù)組,使用字符串時(shí),要驗(yàn)證的字段需用 , 隔開(kāi)

//自定義場(chǎng)景
  protected $scene = [
    'add'=>"title,content",
    'edit'=> ['id','title','content'],
  ];

然后在我們的控制器進(jìn)行數(shù)據(jù)驗(yàn)證

public function add(){

    $ArticleValidate = new ArticleValidate;

    $request_data = [
      'title'=>'我是文章的標(biāo)題',
      'content'=>'我是文章的內(nèi)容',
    ];

    if (!$ArticleValidate->scene('add')->check($request_data)) {
      var_dump($ArticleValidate->getError());
    }

  }

控制器內(nèi)驗(yàn)證

當(dāng)然我們也允許你不創(chuàng)建驗(yàn)證類來(lái)驗(yàn)證數(shù)據(jù),

public function add(){

    $Validate = new BaseValidate;

    $request_data = [
      'title'=>'我是文章的標(biāo)題',
      'content'=>'我是文章的內(nèi)容',
    ];

    $rule =[
      'id'=>'required',
      'title' => 'required|max:255',
      'content' => 'required',
    ];
    //自定義驗(yàn)證信息
    $message = [
      'id.required'=>'缺少文章id',
      'title.required'=>'請(qǐng)輸入title',
      'title.max'=>'title長(zhǎng)度不能大于 255',
      'content.required'=>'請(qǐng)輸入內(nèi)容',
    ];

    if (!$Validate->check($request_data,$rule,$message)) {
      var_dump($Validate->getError());
    }
  }

通過(guò)驗(yàn)證場(chǎng)景,既減少了控制器代碼的臃腫,又減少了 FormRequest 文件過(guò)多,還可以自定義 json 數(shù)據(jù)是不是方便多了呢,

參考文檔

laravel 表單驗(yàn)證 :表單驗(yàn)證《Laravel 5.5 中文文檔》
thinkphp 驗(yàn)證場(chǎng)景 :https://www.kancloud.cn/manual/thinkphp5_1/354104

到此這篇關(guān)于為你的 Laravel 驗(yàn)證器加上多驗(yàn)證場(chǎng)景的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Laravel 驗(yàn)證器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

本文為楊攀遙原創(chuàng)文章,如若轉(zhuǎn)載,無(wú)需和我聯(lián)系,但請(qǐng)注明出處 [楊攀遙的博客]:https://www.yangpanyao.com/archives/120.html

相關(guān)文章

最新評(píng)論