volcanus/validation

3.0.0 2023-02-03 01:42 UTC

This package is auto-updated.

Last update: 2024-08-30 01:34:13 UTC


README

Latest Stable Version Continuous Integration

这是一个用于验证对象属性或数组值的有效性,如类型、长度、值大小等的库。

验证过程本身是以独立的类(Checker)实现,并有一定的工作经验。

(实际上,这个项目是为了为这些验证过程编写测试用例而开始的)

检查器(Checker)

库中包含的默认检查器会通过check()方法验证提供的参数,并在不合适的情况下抛出实现了Volcanus\Validation\Exception\CheckerException接口的异常。

<?php

    use Volcanus\Validation\Context;
    use Volcanus\Validation\Checker\IntChecker;
    use Volcanus\Validation\Exception\CheckerException;
    use Volcanus\Validation\Exception\CheckerException\IntException;
    use Volcanus\Validation\Exception\CheckerException\MinValueException;
    use Volcanus\Validation\Exception\CheckerException\MaxValueException;

    $checker = new IntChecker();
    try {
        $checker->check('foo', ['min' => 1, 'max' => 10]);
    } catch (IntException $e) {
        die('数値を入力してください');
    } catch (MinValueException $e) {
        die('1以上の数値を入力してください');
    } catch (MaxValueException $e) {
        die('10以下の数値を入力してください');
    }

默认检查器实现了__invoke()方法,也可以作为回调处理。

<?php

    $checker = new IntChecker();
    try {
        $checker($data['number'], [
            'min' => 1,
            'max' => 10,
        ]);
    } catch (CheckerException $e) {
        die('1から10までの数値を入力してください');
    }

Context类

Context类用于保存检查目标对象或数组,并通过Context::check()方法指定属性或数组的键进行验证。

<?php

    $validation = new Context([
        'id'   => 10,
        'name' => '',
    ]);
    $validation->check('id'  , 'notEmpty');
    $validation->check('id'  , 'int' , ['min' => 1, 'max' => 10]);
    $validation->check('name', 'notEmpty');
    $validation->check('name', 'maxLength', ['length' => 10]);

除了可以从check()方法的返回值中获取验证结果外,还可以使用isValid()方法或isError()方法来检查结果。

<?php

    if ($validation->isValid()) {
        // 正常時の処理
    } else {
        $errors = [];
        if ($validation->isError('id', 'notEmpty')) {
            $errors[] = 'IDを入力してください';
        }
        if ($validation->isError('id', 'int')) {
            $errors[] = 'IDが不正です';
        }
        if ($validation->isError('name', 'notEmpty')) {
            $errors[] = '名前を入力してください';
        }
        if ($validation->isError('name', 'maxLength')) {
            $errors[] = '名前が長すぎます';
        }
    }

默认检查器在检测到错误后,会跳过同一项目的后续检查。在上面的例子中,name值由于notEmpty检查而出错,maxLength检查将不会执行。

除了默认检查器外,还可以使用registerChecker()方法注册自定义的检查处理。

<?php

    $validation = new Context([
        'id'   => 0,
        'name' => '',
    ]);
    $validation->registerChecker('int', function($value, $options = [])) {
        if (!ctype_digit(strval($value)) ||
            strcmp(strval($value), sprintf('%d', $value)) !== 0
        ) {
            return false;
        }
        if (isset($options[0]) && intval($value) < $options[0]) {
            return false;
        }
        if (isset($options[1]) && intval($value) > $options[1]) {
            return false;
        }
        return true;
    });
    $validation->registerChecker('notEmpty', function($value) {
        return (isset($value) && strlen($value) !== 0);
    });

    $validation->check('id'  , 'int', [1, 10]); // false
    $validation->check('name', 'notEmpty'); // false

支持环境

  • PHP 8.1及以后版本