{% raw %}

PHP Respect 验证教程

原文: https://zetcode.com/php/respectvalidation/

PHP Respect 验证教程展示了如何使用 Respect 验证包来验证 PHP 值。

Respect 验证

Respect 验证是一个 PHP 独立验证库。

安装

  1. $ composer require respect/validation
  2. $ composer require tightenco/collect

我们安装了 Respect 验证包和 Laravel 的集合包。

Respect 验证简单示例

在第一个示例中,我们展示了如何进行非常简单的验证。

simple.php

  1. <?php
  2. require('vendor/autoload.php');
  3. use Respect\Validation\Validator as v;
  4. $name = "John Doe";
  5. $r = v::alnum()->validate($name);
  6. if ($r) {
  7. echo "Validation passed";
  8. } else {
  9. echo "Validation failed";
  10. }

该示例验证一个值。

  1. use Respect\Validation\Validator as v;

我们包括验证器。

  1. $r = v::alnum()->validate($name);

alnum是一个允许字母数字值的验证规则。 它还允许有空间。 validate()方法将验证规则,并返回指示失败或成功的布尔值。

  1. if ($r) {
  2. echo "Validation passed";
  3. } else {
  4. echo "Validation failed";
  5. }

基于返回的值,我们显示验证消息。

  1. $ php simple.php
  2. Validation passed

这是输出。

新增字符

我们可以在规则中添加一个字符。

add_character.php

  1. <?php
  2. require('vendor/autoload.php');
  3. use Respect\Validation\Validator as v;
  4. $name = "Vane-Tempest-Stewart";
  5. $r = v::alnum('-')->validate($name);
  6. if ($r) {
  7. echo "Validation passed";
  8. } else {
  9. echo "Validation failed";
  10. }

在示例中,我们在alnum规则中添加了破折号。

  1. $name = "Vane-Tempest-Stewart";

一些名称可能包含破折号。

  1. $r = v::alnum('-')->validate($name);

我们在alnum规则中添加破折号。

Respect 验证链接规则

规则可以链接在一起。

chaining.php

  1. <?php
  2. require('vendor/autoload.php');
  3. use Respect\Validation\Validator as v;
  4. $name = "John";
  5. $r = v::alnum()->length(4, null)->validate($name);
  6. if ($r) {
  7. echo "Validation passed";
  8. } else {
  9. echo "Validation failed";
  10. }

在示例中,我们有两个规则:alnumlength

  1. $r = v::alnum()->length(4, null)->validate($name);

该名称只能包含字母数字字符,并且必须至少包含四个字符。

Respect 验证合并规则

规则的组合类似于链接技术。 Rules\AllOf用于组合多个规则。

combine_rules.php

  1. <?php
  2. require('vendor/autoload.php');
  3. use Respect\Validation\Validator as v;
  4. use Respect\Validation\Rules;
  5. $name = "John";
  6. $nameValidator = new Rules\AllOf(
  7. new Rules\Alnum(),
  8. new Rules\Length(5, 40)
  9. );
  10. $r = $nameValidator->validate($name);
  11. if ($r) {
  12. echo "Validation passed";
  13. } else {
  14. echo "Validation failed";
  15. }

该示例将两个验证规则与Rules\AllOf结合在一起。

Respect 验证断言函数

validate()方法返回一个布尔值。 assert()方法返回完整的验证报告。

assert_fun.php

  1. <?php
  2. require('vendor/autoload.php');
  3. use Respect\Validation\Validator as v;
  4. use Respect\Validation\Exceptions\NestedValidationException;
  5. $name = "";
  6. $validator = v::alnum()->notempty();
  7. try {
  8. $validator->assert($name);
  9. } catch(NestedValidationException $ex) {
  10. $coll = collect($ex->getMessages());
  11. $messages = $coll->flatten();
  12. foreach ($messages as $message) {
  13. echo $message . "\n";
  14. }
  15. }

该示例对验证规则使用assert()方法,并显示错误消息。

  1. $validator->assert($name);

我们使用assert()验证名称值。

  1. $coll = collect($ex->getMessages());
  2. $messages = $coll->flatten();
  3. foreach ($messages as $message) {
  4. echo $message . "\n";
  5. }

借助 Laravel 的集合,我们显示了错误消息。

  1. $ php assert_fun.php
  2. "" must contain only letters (a-z) and digits (0-9)
  3. "" must not be empty

This is the output.

Respect 验证范围

between规则验证范围,包括整数,字符和日期。

between_rule.php

  1. <?php
  2. require('vendor/autoload.php');
  3. use Respect\Validation\Validator as v;
  4. $age = 34;
  5. $r = v::intVal()->between(18, 99)->validate($age);
  6. if ($r) {
  7. echo "Age validation passed\n";
  8. } else {
  9. echo "Age validation failed\n";
  10. }
  11. $char = 'g';
  12. $r = v::stringType()->between('a', 'c')->validate($char);
  13. if ($r) {
  14. echo "Letter validation passed\n";
  15. } else {
  16. echo "Letter validation failed\n";
  17. }
  18. $myDate = '2013-01-01';
  19. $r = v::date()->between('2009-01-01', '2019-01-01')->validate($myDate);
  20. if ($r) {
  21. echo "Date validation passed\n";
  22. } else {
  23. echo "Date validation failed\n";
  24. }

该示例使用between规则。

  1. $r = v::intVal()->between(18, 99)->validate($age);

此规则检查$age变量是否在 18 到 99 之间。

  1. $r = v::stringType()->between('a', 'c')->validate($char);

此规则检查$char变量是否在’a’和’c’字符之间。

  1. $r = v::date()->between('2009-01-01', '2019-01-01')->validate($myDate);

该规则检查$myDate变量是否在两个指定的日期之间。

Respect 验证对象

对象属性使用attribute()进行验证。

user.php

  1. <?php
  2. class User {
  3. private $name;
  4. private $email;
  5. public function getName() : string {
  6. return $this->name;
  7. }
  8. public function setName($name) : void {
  9. $this->name = $name;
  10. }
  11. public function getEmail() : string {
  12. return $this->email;
  13. }
  14. public function setEmail($email) : void {
  15. $this->email = $email;
  16. }
  17. }

这是user.php

validate_object.php

  1. <?php
  2. require('vendor/autoload.php');
  3. require_once('user.php');
  4. use Respect\Validation\Validator as v;
  5. use Respect\Validation\Exceptions\NestedValidationException;
  6. $user = new User();
  7. $user->setName('Jo');
  8. $user->setEmail('johndoe#gmail.com');
  9. $userValidator = v::attribute('name', v::alnum()->length(4, null))
  10. ->attribute('email', v::email());
  11. try {
  12. $userValidator->assert($user);
  13. } catch(NestedValidationException $ex) {
  14. $coll = collect($ex->getMessages());
  15. $messages = $coll->flatten();
  16. foreach ($messages as $message) {
  17. echo $message . "\n";
  18. }
  19. }

该示例验证User类的属性。

  1. $userValidator = v::attribute('name', v::alnum()->length(4, null))
  2. ->attribute('email', v::email());

这些是用户对象属性的规则。

  1. $ php validate_object.php
  2. name must have a length greater than 4
  3. email must be valid email

This is the output.

自定义消息

我们可以提供自定义验证消息。

custom_message.php

  1. <?php
  2. require('vendor/autoload.php');
  3. use Respect\Validation\Validator as v;
  4. use Respect\Validation\Exceptions\NestedValidationException;
  5. $name = "";
  6. $validator = v::alnum()->notEmpty()->setName('name');
  7. try {
  8. $validator->assert($name);
  9. } catch(NestedValidationException $ex) {
  10. $errors = $ex->findMessages([
  11. 'alnum' => '{{name}} must contain only letters and digits',
  12. 'notEmpty' => '{{name}} must not be empty'
  13. ]);
  14. $coll = collect($errors);
  15. $messages = $coll->flatten();
  16. foreach ($messages as $message) {
  17. echo $message . "\n";
  18. }
  19. }

该示例添加了两个自定义消息。

  1. $validator = v::alnum()->notEmpty()->setName('name');

使用setName()方法,我们为模板占位符设置了一个值。

  1. $errors = $ex->findMessages([
  2. 'alnum' => '{{name}} must contain only letters and digits',
  3. 'notEmpty' => '{{name}} must not be empty'
  4. ]);

在这里,我们提供自定义错误消息。

  1. $ php custom_message.php
  2. name must contain only letters and digits
  3. name must not be empty

This is the output.

您可能也对以下相关教程感兴趣: PHP Rakit 验证教程Valitron 教程PHP PDO 教程Twig 教程PHP 文件系统函数PHP 教程

在本教程中,我们使用了 PHP Respect 验证库来验证值。

{% endraw %}