PHP 8 的对象验证器

您是否曾经尝试过在 PHP 中验证对象。也许您使用模型、视图模型或请求模型。也许您讨厌编写 if-else、循环和开关来检查您的值。也许您不喜欢为每个框架使用不同的验证器。

至少我会。

因此,我向您展示了我使用 PHP 8 的优势的通用解决方案。干净、简洁、容易。

这样做是使用新的 PHP属性来验证您的值对象。(特别是如果您使用的是 DDD)或/并且您不希望它依赖于特定的框架。

它由以下功能组成:

  • 大量验证
  • 还支持嵌套对象验证
  • 可重复验证属性
  • 使用私有属性和方法
  • 与构造函数提升一起使用
  • 内存和时间分析
  • 自定义错误消息
  • 异常的自定义属性和方法名称
  • 严重性级别
  • 调试资源管理器
  • 回调执行

例子

<?php

use RMValidator\Attributes\PropertyAttributes\Collection\UniqueAttribute;
use RMValidator\Attributes\PropertyAttributes\File\FileExtensionAttribute;
use RMValidator\Attributes\PropertyAttributes\File\FileSizeAttribute;
use RMValidator\Attributes\PropertyAttributes\Numbers\RangeAttribute;
use RMValidator\Attributes\PropertyAttributes\Object\NestedAttribute;
use RMValidator\Attributes\PropertyAttributes\Strings\StringContainsAttribute;
use RMValidator\Enums\ValidationOrderEnum;
use RMValidator\Options\OptionsModel;
use RMValidator\Validators\MasterValidator;

require __DIR__ . '/vendor/autoload.php';


class Test 
{
    public function __construct(
        #[RangeAttribute(from:10, to:50)]
        #[RangeAttribute(from:10, to:30)]
        public int $param)
    {

    }

    #[RangeAttribute(from:10, to:30)]
    const propTest = 40;

    #[UniqueAttribute()]
    public function custom() {
        return ['asd', 'asdk'];
    }

    #[FileSizeAttribute(fileSizeBiggest: 20, fileSizeLowest: 10)]
    #[FileExtensionAttribute(expected:['php'])]
    private function getFile() {
        return __FILE__;
    }

    #[FileSizeAttribute(fileSizeBiggest: 20, fileSizeLowest: 10)]
    #[FileExtensionAttribute(expected:['php'])]
    public string $file = __FILE__;

    #[StringContainsAttribute(needle:"asd")]
    public string $string = "23asd";

    #[RangeAttribute(from:10, to:30)]
    public int $prop = 40;
}

class UpperTest
{
    #[NestedAttribute(excludedProperties:['param'])]
    private Test $test;

    public function __construct(Test $test) {
        $this->test = $test;
    }
}

$test = new Test(40);

try {
    MasterValidator::validate(new UpperTest($test), 
    new OptionsModel(orderOfValidation: [ValidationOrderEnum::PROPERTIES, 
                                         ValidationOrderEnum::METHODS,
                                         ValidationOrderEnum::CONSTANTS], 
                     excludedMethods: ['getFile'], 
                     excludedProperties: ['file']));
} catch(Exception $e) {
    var_dump($e);
}

我对这个东西是如何形成的感到很困惑,但它仍然可以进一步发展和发展。我将享受各种反馈、建议和支持。:)

它可以在下面的链接中找到。

https://github.com/IvanGrigorov/VMValidator