ZetCode

PHP Respect Validation

最后修改于 2025 年 2 月 16 日

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

Respect Validation

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

安装

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

我们安装 Respect Validation 包和 Laravel 的集合包。

Respect Validation 简单示例

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

simple.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";
}

该示例验证一个值。

use Respect\Validation\Validator as v;

我们包含验证器。

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

alnum 是一个验证规则,允许字母数字值。它也允许空格。validate 方法验证规则并返回一个布尔值,指示失败或成功。

if ($r) {

    echo "Validation passed";
} else {

    echo "Validation failed";
}

根据返回的值,我们显示验证消息。

$ php simple.php
Validation passed

添加一个字符

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

add_character.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 规则添加一个破折号。

$name = "Vane-Tempest-Stewart";

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

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

我们向 alnum 规则添加一个破折号字符。

Respect Validation 链式规则

规则可以链式组合。

chaining.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";
}

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

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

名称必须仅包含字母数字字符,并且必须至少有四个字符。

Respect Validation 组合规则

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

combine_rules.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 validation assert 函数

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

assert_fun.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 方法,并显示错误消息。

$validator->assert($name);

我们使用 assert 验证一个 name 值。

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

$messages = $coll->flatten();

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

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

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

Respect Validation between 规则

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

between_rule.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 规则。

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

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

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

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

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

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

Respect Validation 对象

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

user.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

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 类的属性。

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

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

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

自定义消息

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

custom_message.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";
    }
}

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

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

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

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

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

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

来源

Respect Validation - Github 仓库

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

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我撰写了超过 1,400 篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出所有 PHP 教程。