simple-as-fuck/php-validator

该软件包最新版本(0.6.3)没有可用的许可信息。

0.6.3 2024-07-31 10:53 UTC

README

php变量验证器,具有直观的规则链,放入混合中,你最后得到所需的数据类型。

安装

composer require simple-as-fuck/php-validator

支持

如果composer.json中指定的PHP平台要求以安全支持结尾,则将除最后一个版本之外的所有版本视为不受支持。

支持的PHP版本.

用法

/** @var mixed $value */
$value = $config->get('some_value_name');

$rules = \SimpleAsFuck\Validator\Factory\Validator::make($value, 'Config "some_value_name" value');
$validValue = $rules->string()->notEmpty()->notNull();
/*
 * now you have in $validValue really not empty string and even phpstan know the type without any annoying annotation
 * if validation failed \UnexpectedValueException('Config "some_value_name" value must ...') is thrown from rule chain
 */
$stringValues = $rules->array()->ofString()->notNull();

/*
 * shorter notation, value name in validator factory is optional and here is unnecessary,
 * validation exception is thrown in same line as config key name
 * so you should this find in your stacktrace and know than something is wrong in your config file
 */
\SimpleAsFuck\Validator\Factory\Validator::make($config->get('some_value_name'))->string()->notEmpty()->notNull();

此验证可以应用于任何PHP变量,适用于json解码数据。所有规则都为链中的下一个规则声明了类型,因此不需要查找规则列表,你的IDE应该会提示可用的规则,规则链的设计旨在防止冗余规则或不合理的规则组合。

验证异常类型更改

在验证失败时,您可以通过注入自己的异常工厂来更改从规则链抛出的异常类型。

如果您想抛出一些HTTP异常来验证HTTP请求,请注意此验证器不适合验证用户输入。

第一:验证器在嵌套结构中的第一个失败的规则处失败,并且即使可能还有更多的验证失败,也只会抛出一个异常。

第二:验证器抛出高度生成的消息,这些消息可能对用户不可读,且没有计划支持翻译,对于我们这些开发者来说,消息应该是可以的。

第三:意识到我们正在编写PHP服务器端应用程序,因此应用程序应以某些API格式返回数据,并且视图数据应该是某些奇特的JavaScript、本地或移动客户端应用程序。是的,我知道即使PC游戏也是在云端渲染的,但客户端PC也有一定的计算能力,如果客户端逻辑和HTML在服务器端渲染,这只会浪费其能力。

final class ExceptionFactory extends \SimpleAsFuck\Validator\Factory\Exception
{
    /**
     * @param non-empty-string $message
     */
    public function create(string $message): \Exception
    {
        return new \RuntimeException($message);
    }
}

$exceptionFactory = new \ExceptionFactory();

$value = new \SimpleAsFuck\Validator\Model\Validated(1);

$rules = new \SimpleAsFuck\Validator\Rule\General\Rules($exceptionFactory, 'variable', $value);

$validValue = $rules->int()->notNull();

自定义

用户定义规则

您可以创建自己的规则并将其放在规则链的末尾,这允许您运行一些自己的验证。

如果您正在验证某些广泛标准化的内容,请考虑为规则链做出贡献,以更好地编写它或与他人分享一些规则。

/**
 * @implements \SimpleAsFuck\Validator\Rule\Custom\UserDefinedRule<string, string>
 */
final class GandalfRule implements \SimpleAsFuck\Validator\Rule\Custom\UserDefinedRule
{
    /**
     * @param string $value
     */
    public function validate($value): ?string
    {
        throw new \SimpleAsFuck\Validator\Model\ValueMust('not pass');
    }
}

$rules = \SimpleAsFuck\Validator\Factory\Validator::make('');

$rules->string()->custom(new \GandalfRule())->notNull();

用户类规则

验证器规则链总是返回某种特定类型,因此通用对象不在选项之列。您可以将对象转换为具有验证结构的某些类。

/**
 * @implements \SimpleAsFuck\Validator\Rule\Custom\UserClassRule<YourClass>
 */
final class YourClassRule implements \SimpleAsFuck\Validator\Rule\Custom\UserClassRule
{
    public function validate(\SimpleAsFuck\Validator\Rule\Object\ObjectRule $object): YourClass
    {
        return new YourCass(
            $object->property('propertyName')->string()->max(30)->notNull()
            // some next property ...
        );
    }
}

/** @var mixed $data */

$rules = \SimpleAsFuck\Validator\Factory\Validator::make($data);

$yourObject = $rules->object()->class(new YourClassRule())->notNull();
$yourObjects = $rules->array()->ofClass(new YourClassRule())->notNull();