ホームページ >バックエンド開発 >PHPチュートリアル >ThinkPHP5 バリデーターの具体的な使用法

ThinkPHP5 バリデーターの具体的な使用法

不言
不言オリジナル
2018-05-31 15:34:123088ブラウズ

この記事では、主に ThinkPHP5 バリデーターの具体的な使用方法を紹介します。これを必要とする友人に参考にしてもらいます。

はクライアントから渡されたパラメータを受け入れます。このパラメータが信頼できないことは誰もが知っているため、バックエンド開発者はこのパラメータを検証する必要があります。以前の開発では tp5 バリデーターの存在だけは知っていましたが、以前の開発検証ではモデル フィールドに基づいたものが多かったので、その目的は知りませんでした。バリデーターは API 開発に適しています

今日はバリデーターの使用法について簡単に説明します

バリデーターを作成します

  1. 別のバリデーターを作成します

  2. 呼び出し検証

  3. 1. バリデーターを作成します

まず、モジュールの下にコントローラーと同じレベルにフォルダーを作成し、それに validate

という名前を付けます。バリデータを作成する クラスを作成し、tp5 の validate クラスを継承するだけです。

しかし、オブジェクト指向の考え方に精通している友人なら、すべてのバリデーターで使用する必要があるメソッドが必要な場合に、tp5 のソース コードを変更しないことを知っているはずです。基本クラスとしてもう 1 つのクラスを作成します。すべてのバリデーターはこの基本クラスを継承し、この基本クラスは tp5 の検証クラスを継承します。

ここでは、baseValidate という名前を付けます


それでは、本格的なバリデーターを作成しましょう。例:

namespace app\index\validate;

use think\Validate;

class User extends Validate
{
  protected $rule = [
    'name' => 'require|max:25',
    'email' => 'email',
  ];

}

次に、コントローラーまたはモデルでインスタンス化して、

//虚拟一组数据,实际开发中是接受用户传递的数据
$data = [
  'name'=>'thinkphp',
  'email'=>'thinkphp@qq.com'
];

$validate = Loader::validate('User');

if(!$validate->check($data)){
  dump($validate->getError());
}


を呼び出します。このようなバリデーターアプリケーションが作成されます。何か簡素化できるものがないか見てみましょう。

まず、検証する必要があるのはクライアントから受け取るデータです

  1. 次に、検証が失敗した場合、データを検証する必要があります。エラー メッセージを返します

  2. これら 2 つの手順は、インターフェイスが要求されるたびに実行されます。次に、これを BaseValidate にカプセル化したいと思います

namespace app\home\validate;
use think\Exception;
use think\Request;
use think\Validate;
class BaseValidate extends Validate
{
  public function goCheck($data='')
  {
    //实例化请求对象
    $requestObj=Request::instance();
    //如果传入为空则获取请求里的参数
    empty($data)&&$data=$requestObj->param();
    if ($this->check($data)) {
      //如果验证通过了
      return true;
    }else{
      //如果验证没通过
      $error=$this->getError();
      //抛出异常
      throw new Exception($error);
    }
  }
}


goCheck メソッドがカプセル化された後、検証ルールはどこにあるのかと尋ねる人がいるかもしれません。

2. 別のバリデーターを書く

BaseValidate は継承されるために使用されると前に述べたので、実際のバリデーターはまだ書き始めていません。ルールはこのバリデータに定式化されます。より深く理解するために、カスタム検証ルールを使用した例を次に示します。実際、tp が作成した検証ルールは非常に役立つはずです 最も一般的に受け入れられているデータ、つまり id を例に挙げてみましょう。通常、この ID はデータベース内の特定のデータの ID を表します。 id 符号なしの自動インクリメント主キーとして設計されており、人間の言語に翻訳すると正の整数になります。次に、顧客から渡されたパラメータが負の数または小数の場合、検証に合格しないはずです。

上記の要件に基づいて、バリデータを作成しましょう。場所は以前と同じで、IdMustBePositiveInt.php という名前の検証フォルダー内にあります


(名前は少し長いですが、幸いなことにわかりやすいです)

まず第一に、基本的なバリデーターを継承する必要があります

class IdMustBePositiveInt extends BaseValidate


次に、ルールを作成し、固定メンバー変数に値を代入します

  protected $rule = [
  //require是内置规则,而tp5并没有正整数的规则,所以下面这个positiveInt使用自定义的规则
    'id' => 'require|positiveInt'
  ];


では、カスタムルールを行う方法は実際には簡単です。保護されたメソッドを定義します

//系统会自动传入几个参数 第一个是 要验证的值,第二个是规则,自己可以规定规则内容或者不写,第三个是最初传入的data。其实不只这三个参数,想了解详细的可以看看文档
 protected function positiveInt($value, $rule='', $data)
  {
    if (is_int(($value+0))&&($value+0)>0) {
      return true;
    }else{
      return 'id必须为正整数';
    }
  }


! !注: ここで判定が失敗した場合、戻り値は false ではなく、エラー メッセージです。

3. 呼び出し検証

前のカプセル化によると、達成する必要がある効果は、パラメーターの受け入れとパラメーターの検証を 1 つにまとめることです。では、どうやって検証を呼び出すのかここで、ID を例にしてみましょう

 public function test($id)
  {
    //在控制器中直接调用写上这行代码就搞定验证了
    (new IdMustBePositiveInt)->goCheck();
  }


たった 1 行のコードで、検証を直接行うことができます。 ID バリデーターをインスタンス化するとき、その親クラスの goCheck メソッドを呼び出します。

  1. goCheck メソッドはパラメータを受け入れ、パラメータを validate オブジェクトの check メソッドに渡すと、ID バリデータの $rule で指定された require ルールとカスタム ルールに一致します。

  2. すべてが合格した場合、trueを返します

  3. それらの1つが一致しない場合、例外がスローされます

这次只举了id为例子,虽然看上去比直接写独立验证麻烦很多,但是大家仔细想想,这个验证规则其实在很多地方都是一样的,比如密码验证规则,用户名验证规则等,当这个项目写完了。你已经完成了很多验证器。其实在下个项目中还可以继续套用的哦

TP5验证规则使用

①静态调用(使用内置的规则验证单个数据,返回值为布尔值)

// 日期格式验证
Validate::dateFormat('2016-03-09','Y-m-d'); // true
// 验证是否有效的日期
Validate::is('2016-06-03','date'); // true
// 验证是否有效邮箱地址
Validate::is('thinkphp@qq.com','email'); // true
// 验证是否在某个范围
Validate::in('a',['a','b','c']); // true
// 验证是否大于某个值
Validate::gt(10,8); // true
// 正则验证
Validate::regex(100,'\d+'); // true

②模型验证(在模型中的验证方式)

$User = new User;
$result = $User->validate(
  [
    'name' => 'require|max:25',
    'email'  => 'email',
  ],
  [
    'name.require' => '名称必须',
    'name.max'   => '名称最多不能超过25个字符',
    'email'    => '邮箱格式错误',
  ]
)->save($data);
if(false === $result){
  // 验证失败 输出错误信息
  dump($User->getError());
}

③控制器验证(控制器中进行验证)

如果你需要在控制器中进行验证,并且继承了\think\Controller的话,可以调用控制器类提供的validate方法进行验证,如下:

$result = $this->validate(
  [
    'name' => 'thinkphp',
    'email' => 'thinkphp@qq.com',
  ],
  [
    'name' => 'require|max:25',
    'email'  => 'email',
  ]);
if(true !== $result){
  // 验证失败 输出错误信息
  dump($result);
}

控制器中的验证代码可以简化为:

$result = $this->validate($data,'User');
if(true !== $result){
  // 验证失败 输出错误信息
  dump($result);
}

如果要使用场景,可以使用:

$result = $this->validate($data,'User.edit');
if(true !== $result){
  // 验证失败 输出错误信息
  dump($result);
}

在validate方法中还支持做一些前置的操作回调,使用方式如下:

$result = $this->validate($data,'User.edit',[],[$this,'some']);
if(true !== $result){
  // 验证失败 输出错误信息
  dump($result);
}

好了,本次tp5验证器的介绍了就写到这里了,希望对大家的学习有所帮助。

相关推荐:

ThinkPHP5.0框架控制器继承基与自定义类案例详解

Thinkphp5 前置操作详解

以上がThinkPHP5 バリデーターの具体的な使用法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。