Maison  >  Article  >  développement back-end  >  Utilisation spécifique du validateur ThinkPHP5

Utilisation spécifique du validateur ThinkPHP5

不言
不言original
2018-05-31 15:34:123001parcourir

Cet article présente principalement l'utilisation spécifique du validateur ThinkPHP5, qui a une certaine valeur de référence. Maintenant, je le partage avec tout le monde. Les amis dans le besoin peuvent s'y référer

Avant-propos :

Lorsque nous développons des API, nous accepterons les paramètres du client. Tout le monde sait que ce paramètre n'est pas fiable. Nos développeurs back-end doivent vérifier ce paramètre. Je ne connaissais le validateur tp5 que lors d'un développement précédent, mais je ne connaissais pas son objectif, car la vérification du développement précédent était souvent basée sur des champs de modèle. Le validateur est plus adapté au développement d'API. Aujourd'hui, je vais parler brièvement de l'utilisation du validateur

Répertoire :

  1. Créer un validateur<.>

  2. Écrire un validateur séparé
  3. Validation d'appel

1. un validateur Nous avons d'abord besoin d'un dossier pour stocker notre validateur. Nous créons un dossier au même niveau que le contrôleur sous le module et le nommons validate

Ensuite, nous pouvons créer le validateur. Il nous suffit de créer une classe et d'hériter de la classe validate de tp5.

Mais les amis qui sont familiers avec la pensée orientée objet doivent savoir que lorsque nous avons besoin d'une méthode qui doit être utilisée par chaque validateur, mais ne modifiez pas le code source de tp5. Nous écrirons une classe supplémentaire comme classe de base. Tous les validateurs héritent de cette classe de base, puis cette classe de base hérite de la classe de validation de tp5.

Ici, nous l'appelons baseValidate


Créons maintenant un validateur sérieux. Par exemple :

namespace app\index\validate;

use think\Validate;

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

}
puis instanciez-le dans le contrôleur ou le modèle puis appelez


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

$validate = Loader::validate(&#39;User&#39;);

if(!$validate->check($data)){
  dump($validate->getError());
}
Une telle application de validation est maintenant écrite. Voyons s'il y a quelque chose que nous pouvons simplifier.

Tout d'abord, les données qui doivent être vérifiées sont celles que nous recevons du client. Ensuite, la première étape consiste à accepter les données
  1. .

    Ensuite, nous devons Les données sont vérifiées. Si la vérification échoue, le message d'erreur
  2. est renvoyé. Ces deux étapes sont effectuées à chaque fois que l'interface est demandée. Ensuite, nous voulons encapsuler cela dans BaseValidate


namespace app\home\validate;
use think\Exception;
use think\Request;
use think\Validate;
class BaseValidate extends Validate
{
  public function goCheck($data=&#39;&#39;)
  {
    //实例化请求对象
    $requestObj=Request::instance();
    //如果传入为空则获取请求里的参数
    empty($data)&&$data=$requestObj->param();
    if ($this->check($data)) {
      //如果验证通过了
      return true;
    }else{
      //如果验证没通过
      $error=$this->getError();
      //抛出异常
      throw new Exception($error);
    }
  }
}
Une fois la méthode goCheck encapsulée, quelqu'un peut demander, cette règle de vérification Où ?

2. Écrivez un validateur séparé

Comme je l'ai déjà dit, BaseValidate est utilisé pour être hérité, donc pour le vrai validateur, nous avons Je n'ai pas commencé à écrire. Les règles sont formulées dans ce validateur. Pour une compréhension plus approfondie, voici un exemple utilisant des règles de validation personnalisées. En fait, les règles de vérification écrites par tp devraient être suffisantes

Prenons comme exemple les données les plus couramment acceptées, qui sont l'identifiant. Habituellement, cet identifiant représente l'identifiant d'une certaine donnée dans notre base de données. conçoivent souvent cet identifiant comme une clé primaire non signée à incrémentation automatique, qui est traduite en langage humain sous la forme d'un entier positif. Ensuite, si le paramètre transmis par le client est un nombre négatif ou décimal, il ne doit pas passer la vérification.

Sur la base des exigences ci-dessus, nous créons un validateur. L'emplacement est toujours le même qu'avant dans le dossier validate

et nommé IdMustBePositiveInt.php (le nom est un peu long, mais heureusement le texte a du sens)

Tout d'abord, nous devons hériter de notre validateur de base


class IdMustBePositiveInt extends BaseValidate
puis formuler des règles pour attribuer une valeur à une variable membre fixe


  protected $rule = [
  //require是内置规则,而tp5并没有正整数的规则,所以下面这个positiveInt使用自定义的规则
    &#39;id&#39; => &#39;require|positiveInt&#39;
  ];
Alors comment personnaliser les règles, c'est en fait simple ? Définissez une méthode protégée


//系统会自动传入几个参数 第一个是 要验证的值,第二个是规则,自己可以规定规则内容或者不写,第三个是最初传入的data。其实不只这三个参数,想了解详细的可以看看文档
 protected function positiveInt($value, $rule=&#39;&#39;, $data)
  {
    if (is_int(($value+0))&&($value+0)>0) {
      return true;
    }else{
      return &#39;id必须为正整数&#39;;
    }
  }
 ! ! Remarque : Si le jugement échoue ici : le retour n'est pas faux mais un message d'erreur.


3. Vérification des appels

Selon notre encapsulation précédente, l'effet que nous devons obtenir est d'accepter les paramètres et de vérifier les paramètres. en un. Alors maintenant, comment appelons-nous la vérification ?

Voici les trucs géniaux Prenons l'identité comme exemple


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

Avec une seule ligne de code, la vérification peut se faire directement. Lorsque nous instancions le validateur d'identifiant, nous appelons la méthode goCheck de sa classe parent.
  1. La méthode goCheck acceptera les paramètres et transmettra les paramètres à la méthode check sur l'objet de validation
  2. correspondra à ce que nous avons dans le id validateur Les règles require spécifiées dans $rule et nos règles personnalisées.
  3. Si tout réussit, il retournera vrai
  4. Si l'un d'entre eux ne correspond pas, une exception sera levée

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

TP5验证规则使用

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

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

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

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

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

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

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

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

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

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

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

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

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

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

相关推荐:

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

Thinkphp5 前置操作详解

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn