VMValidator

Hello, this is simple attribute validation for PHP Models, based on the new features, presented in PHP 8

View on GitHub

VMValidator

VMValidator test check

VMValidator

"Buy Me A Coffee"

Hello, this is simple attribute validation for PHP Models, based on the new features, presented in PHP 8 It works as a standalone and can be use in custom projects or in libraries like Symfony and Laravel.

Use just three rows, alogside some attributes:

Example

<?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);
}

Installation

composer require ivangrigorov/vmvalidator

Options

In what order to validate the classes (methods or properties first), and what to exclude is directly configurable runtime here

Extras

*The custom validation should be declared as static in a validation class

class Validation 
{
    public static function validate($valueToTest, $arg1): bool 
    {
        return $valueToTest == $arg1;
    }
}

The method should always return boolean: true for valid input and false for invalid.

In the declaration:

#[CustomAttribute(staticClassName: Validation::class, staticMethodName: 'validate', args: [2])]

You can pass additional arguments to use in the validation function, but the first parameter is always the value to be tested.

*The or validation uses custom attribute names

    #[RangeAttribute(from:10, to:30, name: "orOne")]
    #[RangeAttribute(from:10, to:40, name: "orTwo")]
    const tttt = 40;
    MasterValidator::validate($test, new OptionsModel(orAttributes: ['orOne', 'orTwo']));

*Callback execution

$successCallable is executed on successful validation

$failureCallable is executed on unsuccessful validation

$forcedCallable is executed on successful AND unsuccessful validation

Severity

Add option to make the failed validation throw NOTICE|WARNING|ERROR

    #[RangeAttribute(from:10, to:30, severity: SeverityEnum::ERROR)]

Debugging

Add option to display all validations per class

    MasterValidator::debug(<ClassToDebug>::class);

Support