Heim > Backend-Entwicklung > PHP-Tutorial > Spezifische Verwendung des ThinkPHP5-Validators

Spezifische Verwendung des ThinkPHP5-Validators

不言
Freigeben: 2023-03-28 17:46:01
Original
3117 Leute haben es durchsucht

Dieser Artikel stellt hauptsächlich die spezifische Verwendung des ThinkPHP5-Validators vor, der einen gewissen Referenzwert hat. Jetzt kann ich ihn mit allen teilen, die ihn brauchen.

Vorwort:

Bei der API-Entwicklung akzeptieren wir Parameter vom Client. Jeder weiß, dass dieser Parameter nicht vertrauenswürdig ist. Ich kannte den tp5-Validator nur aus früheren Entwicklungen, kannte aber seinen Zweck nicht, da die Überprüfung früherer Entwicklungen häufig auf Modellfeldern basierte. Der Validator eignet sich besser für die API-Entwicklung. Heute werde ich kurz auf die Verwendung des Validators eingehen.

Verzeichnis:

  1. Validator erstellen

  2. Separaten Validator schreiben

  3. Validierung aufrufen

1. Erstellen ein Validator

Zuerst benötigen wir einen Ordner zum Speichern unseres Validators. Wir erstellen einen Ordner auf der gleichen Ebene wie der Controller unter dem Modul und nennen ihn „validate“

Dann können wir den Validator erstellen. Wir müssen nur eine Klasse erstellen und die Validierungsklasse von tp5 erben.

Aber Freunde, die mit objektorientiertem Denken vertraut sind, müssen wissen, dass wir eine Methode benötigen, die von jedem Validator verwendet werden muss, aber den Quellcode von tp5 nicht ändern darf. Wir werden eine weitere Klasse als Basisklasse schreiben. Alle Validatoren erben diese Basisklasse, und dann erbt diese Basisklasse die Validierungsklasse von tp5.

Hier nennen wir es baseValidate

Jetzt erstellen wir einen seriösen Validator. Zum Beispiel:

namespace app\index\validate;

use think\Validate;

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

}
Nach dem Login kopieren

dann instanziieren Sie es im Controller oder Modell und rufen Sie dann

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

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

if(!$validate->check($data)){
  dump($validate->getError());
}
Nach dem Login kopieren

< auf 🎜>

Eine solche Validator-Anwendung ist jetzt geschrieben. Mal sehen, ob wir etwas vereinfachen können.

  1. Zuerst müssen die Daten überprüft werden, die wir vom Kunden erhalten. Anschließend müssen wir die Daten akzeptieren

  2. Dann müssen wir die Daten überprüfen. Wenn die Überprüfung fehlschlägt, wird die Fehlermeldung

zurückgegeben. Diese beiden Schritte werden jedes Mal ausgeführt, wenn die Schnittstelle angefordert wird. Dann möchten wir dies in BaseValidate kapseln


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);
    }
  }
}
Nach dem Login kopieren

Nachdem die goCheck-Methode gekapselt ist, fragt sich vielleicht jemand, wo die Verifizierungsregel ist?

2. Schreiben Sie einen separaten Validator

Wie ich bereits sagte, wird BaseValidate verwendet, um vererbt zu werden, also haben wir dies für den echten Validator getan Habe nicht angefangen zu schreiben. Die Regeln werden in diesem Validator formuliert. Für ein tieferes Verständnis finden Sie hier ein Beispiel mit benutzerdefinierten Validierungsregeln. Tatsächlich sollten die von tp geschriebenen Verifizierungsregeln ausreichen

Nehmen wir als Beispiel die am häufigsten akzeptierten Daten, nämlich die ID. Normalerweise stellt diese ID die ID eines bestimmten Datenelements in unserer Datenbank dar Entwerfen Sie diese ID häufig als vorzeichenlosen, automatisch inkrementierenden Primärschlüssel, der als positive Ganzzahl in die menschliche Sprache übersetzt wird. Wenn der vom Kunden übergebene Parameter dann eine negative Zahl oder eine Dezimalzahl ist, sollte er die Überprüfung nicht bestehen.


Basierend auf den oben genannten Anforderungen erstellen wir einen Validator. Der Speicherort ist immer noch derselbe wie zuvor im Validierungsordner

und heißt IdMustBePositiveInt.php (der Name ist etwas lang, aber zum Glück macht der Text Sinn)

Zuerst müssen wir unseren Basisvalidator


class IdMustBePositiveInt extends BaseValidate
Nach dem Login kopieren

erben und dann Regeln formulieren, um einer festen Mitgliedsvariablen einen Wert zuzuweisen


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

Wie kann man also die Regeln anpassen? Definieren Sie eine geschützte Methode


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

! ! Hinweis: Wenn das Urteil hier fehlschlägt: Die Rückgabe ist nicht falsch, sondern eine Fehlermeldung.


3. Aufrufverifizierung

Gemäß unserer vorherigen Kapselung besteht der Effekt, den wir erreichen müssen, darin, Parameter zu akzeptieren und zu überprüfen in einem. Wie nennen wir nun die Verifizierung?

Hier kommt das tolle Zeug, nehmen wir als Beispiel die ID


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

  1. Mit nur einer Codezeile erfolgt die Verifizierung direkt. Wenn wir den ID-Validator instanziieren, rufen wir die goCheck-Methode seiner übergeordneten Klasse auf.

  2. Die goCheck-Methode akzeptiert Parameter und übergibt die Parameter an die Prüfmethode für das Validierungsobjekt.

  3. stimmt mit dem überein, was wir in der haben ID-Validator Die in $rule angegebenen erforderlichen Regeln und unsere benutzerdefinierten Regeln.

  4. Wenn alle erfolgreich sind, wird true zurückgegeben

  5. Wenn einer von ihnen nicht übereinstimmt, wird eine Ausnahme ausgelöst

这次只举了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
Nach dem Login kopieren

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

$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());
}
Nach dem Login kopieren

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

如果你需要在控制器中进行验证,并且继承了\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);
}
Nach dem Login kopieren

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

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

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

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

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

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

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

相关推荐:

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

Thinkphp5 前置操作详解

Das obige ist der detaillierte Inhalt vonSpezifische Verwendung des ThinkPHP5-Validators. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage