{% raw %}

# PHP Respect 验证教程

> 原文： [https://zetcode.com/php/respectvalidation/](https://zetcode.com/php/respectvalidation/)

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

## Respect 验证

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

## 安装

```php
$ composer require respect/validation
$ composer require tightenco/collect

```

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

## Respect 验证简单示例

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

`simple.php`

```php
<?php

require('vendor/autoload.php');

use Respect\Validation\Validator as v;

$name = "John Doe";

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

if ($r) {

    echo "Validation passed";
} else {

    echo "Validation failed";
}

```

该示例验证一个值。

```php
use Respect\Validation\Validator as v;

```

我们包括验证器。

```php
$r = v::alnum()->validate($name);

```

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

```php
if ($r) {

    echo "Validation passed";
} else {

    echo "Validation failed";
}

```

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

```php
$ php simple.php
Validation passed

```

这是输出。

## 新增字符

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

`add_character.php`

```php
<?php

require('vendor/autoload.php');

use Respect\Validation\Validator as v;

$name = "Vane-Tempest-Stewart";

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

if ($r) {

    echo "Validation passed";
} else {

    echo "Validation failed";
}

```

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

```php
$name = "Vane-Tempest-Stewart";

```

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

```php
$r = v::alnum('-')->validate($name);

```

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

## Respect 验证链接规则

规则可以链接在一起。

`chaining.php`

```php
<?php

require('vendor/autoload.php');

use Respect\Validation\Validator as v;

$name = "John";

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

if ($r) {

    echo "Validation passed";
} else {

    echo "Validation failed";
}

```

在示例中，我们有两个规则：`alnum`和`length`。

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

```

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

## Respect 验证合并规则

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

`combine_rules.php`

```php
<?php
require('vendor/autoload.php');

use Respect\Validation\Validator as v;
use Respect\Validation\Rules;

$name = "John";

$nameValidator = new Rules\AllOf(
    new Rules\Alnum(),
    new Rules\Length(5, 40)
);

$r = $nameValidator->validate($name);

if ($r) {

    echo "Validation passed";
} else {

    echo "Validation failed";
}

```

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

## Respect 验证断言函数

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

`assert_fun.php`

```php
<?php

require('vendor/autoload.php');

use Respect\Validation\Validator as v;
use Respect\Validation\Exceptions\NestedValidationException;

$name = "";

$validator = v::alnum()->notempty();

try {

    $validator->assert($name);
} catch(NestedValidationException $ex) {

    $coll = collect($ex->getMessages());

    $messages = $coll->flatten();

    foreach ($messages as $message) {
        echo $message . "\n";
    }
}

```

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

```php
$validator->assert($name);

```

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

```php
$coll = collect($ex->getMessages());

$messages = $coll->flatten();

foreach ($messages as $message) {
    echo $message . "\n";
}

```

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

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

```

This is the output.

## Respect 验证范围

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

`between_rule.php`

```php
<?php

require('vendor/autoload.php');

use Respect\Validation\Validator as v;

$age = 34; 

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

if ($r) {

    echo "Age validation passed\n";
} else {

    echo "Age validation failed\n";
}

$char = 'g'; 

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

if ($r) {

    echo "Letter validation passed\n";
} else {

    echo "Letter validation failed\n";
}

$myDate = '2013-01-01';

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

if ($r) {

    echo "Date validation passed\n";
} else {

    echo "Date validation failed\n";
}

```

该示例使用`between`规则。

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

```

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

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

```

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

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

```

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

## Respect 验证对象

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

`user.php`

```php
<?php

class User {

    private $name;
    private $email;

    public function getName() : string {

        return $this->name;
    }

    public function setName($name) : void {

        $this->name = $name;
    }

    public function getEmail() : string {

        return $this->email;
    }

    public function setEmail($email) : void {

        $this->email = $email;
    }
}

```

这是`user.php`。

`validate_object.php`

```php
<?php

require('vendor/autoload.php');
require_once('user.php');

use Respect\Validation\Validator as v;
use Respect\Validation\Exceptions\NestedValidationException;

$user = new User();
$user->setName('Jo');
$user->setEmail('johndoe#gmail.com');

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

try {
    $userValidator->assert($user);
} catch(NestedValidationException $ex) {

    $coll = collect($ex->getMessages());

    $messages = $coll->flatten();

    foreach ($messages as $message) {
        echo $message . "\n";
    }
}

```

该示例验证`User`类的属性。

```php
$userValidator = v::attribute('name', v::alnum()->length(4, null))
    ->attribute('email', v::email());

```

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

```php
$ php validate_object.php
name must have a length greater than 4
email must be valid email

```

This is the output.

## 自定义消息

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

`custom_message.php`

```php
<?php

require('vendor/autoload.php');

use Respect\Validation\Validator as v;
use Respect\Validation\Exceptions\NestedValidationException;

$name = "";

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

try {

    $validator->assert($name);
} catch(NestedValidationException $ex) {

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

    $coll = collect($errors);

    $messages = $coll->flatten();

    foreach ($messages as $message) {
        echo $message . "\n";
    }
}

```

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

```php
$validator = v::alnum()->notEmpty()->setName('name');

```

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

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

```

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

```php
$ php custom_message.php
name must contain only letters and digits
name must not be empty

```

This is the output.

您可能也对以下相关教程感兴趣： [PHP Rakit 验证教程](/php/rakitvalidation/)， [Valitron 教程](/php/valitron/)， [PHP PDO 教程](/php/pdo/)， [Twig 教程](/php/twig/)， [PHP 文件系统函数](/articles/phpfilesystemfunctions/)， [PHP 教程](/lang/php/)。

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

{% endraw %}