Skip to content

Commit

Permalink
Mechanism for validating single values, arrays and objects. Path awar…
Browse files Browse the repository at this point in the history
…e validation errors.
  • Loading branch information
serge-kvashnin committed Mar 29, 2024
1 parent 5e2700b commit 5ace994
Show file tree
Hide file tree
Showing 45 changed files with 588 additions and 166 deletions.
23 changes: 23 additions & 0 deletions src/Exception/LogicException.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php

declare(strict_types=1);

namespace Norvica\Validation\Exception;

use Throwable;

final class LogicException extends \LogicException
{
public function __construct(
string $message = '',
int $code = 0,
Throwable|null $previous = null,
array $path = [],
) {
parent::__construct(
sprintf('%s: %s', implode('.', $path), $message),
$code,
$previous,
);
}
}
24 changes: 24 additions & 0 deletions src/Exception/PropertyRuleViolation.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php

declare(strict_types=1);

namespace Norvica\Validation\Exception;

use DomainException;
use Throwable;

final class PropertyRuleViolation extends DomainException
{
public readonly array $path;

public function __construct(
string $message = '',
int $code = 0,
Throwable|null $previous = null,
array $path = [],
)
{
parent::__construct($message, $code, $previous);
$this->path = $path;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@

use DomainException;

final class ConstraintViolation extends DomainException
final class ValueRuleViolation extends DomainException
{
}
2 changes: 1 addition & 1 deletion src/Normalizing/Binary.php → src/Normalizer/Binary.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

declare(strict_types=1);

namespace Norvica\Validation\Normalizing;
namespace Norvica\Validation\Normalizer;

final class Binary
{
Expand Down
2 changes: 1 addition & 1 deletion src/Normalizing/Lower.php → src/Normalizer/Lower.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

declare(strict_types=1);

namespace Norvica\Validation\Normalizing;
namespace Norvica\Validation\Normalizer;

final class Lower
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

declare(strict_types=1);

namespace Norvica\Validation\Normalizing;
namespace Norvica\Validation\Normalizer;

interface Normalizable
{
Expand Down
2 changes: 1 addition & 1 deletion src/Normalizing/Numeric.php → src/Normalizer/Numeric.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

declare(strict_types=1);

namespace Norvica\Validation\Normalizing;
namespace Norvica\Validation\Normalizer;

final class Numeric
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

declare(strict_types=1);

namespace Norvica\Validation\Normalizing;
namespace Norvica\Validation\Normalizer;

final class Spaceless
{
Expand Down
2 changes: 1 addition & 1 deletion src/Normalizing/Trim.php → src/Normalizer/Trim.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

declare(strict_types=1);

namespace Norvica\Validation\Normalizing;
namespace Norvica\Validation\Normalizer;

final readonly class Trim
{
Expand Down
2 changes: 1 addition & 1 deletion src/Normalizing/Upper.php → src/Normalizer/Upper.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

declare(strict_types=1);

namespace Norvica\Validation\Normalizing;
namespace Norvica\Validation\Normalizer;

final class Upper
{
Expand Down
12 changes: 7 additions & 5 deletions src/Constraint/Email.php → src/Rule/Email.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,17 @@

declare(strict_types=1);

namespace Norvica\Validation\Constraint;
namespace Norvica\Validation\Rule;

use Norvica\Validation\Normalizing\Lower;
use Norvica\Validation\Normalizing\Normalizable;
use Norvica\Validation\Normalizing\Trim;
use Attribute;
use Norvica\Validation\Normalizer\Lower;
use Norvica\Validation\Normalizer\Normalizable;
use Norvica\Validation\Normalizer\Trim;
use Norvica\Validation\Validation\EmailValidation;
use Override;

readonly class Email implements Validatable, Normalizable
#[Attribute(Attribute::TARGET_PROPERTY)]
readonly class Email implements Rule, Normalizable
{
/**
* @param bool $dns Perform DNS checks (default `false`).
Expand Down
10 changes: 6 additions & 4 deletions src/Constraint/Flag.php → src/Rule/Flag.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,16 @@

declare(strict_types=1);

namespace Norvica\Validation\Constraint;
namespace Norvica\Validation\Rule;

use Norvica\Validation\Normalizing\Binary;
use Norvica\Validation\Normalizing\Normalizable;
use Attribute;
use Norvica\Validation\Normalizer\Binary;
use Norvica\Validation\Normalizer\Normalizable;
use Norvica\Validation\Validation\FlagValidation;
use Override;

readonly class Flag implements Validatable, Normalizable
#[Attribute(Attribute::TARGET_PROPERTY)]
readonly class Flag implements Rule, Normalizable
{
public function __construct(
public bool $value,
Expand Down
12 changes: 7 additions & 5 deletions src/Constraint/Iban.php → src/Rule/Iban.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,17 @@

declare(strict_types=1);

namespace Norvica\Validation\Constraint;
namespace Norvica\Validation\Rule;

use Norvica\Validation\Normalizing\Normalizable;
use Norvica\Validation\Normalizing\Spaceless;
use Norvica\Validation\Normalizing\Upper;
use Attribute;
use Norvica\Validation\Normalizer\Normalizable;
use Norvica\Validation\Normalizer\Spaceless;
use Norvica\Validation\Normalizer\Upper;
use Norvica\Validation\Validation\IbanValidation;
use Override;

readonly class Iban implements Validatable, Normalizable
#[Attribute(Attribute::TARGET_PROPERTY)]
readonly class Iban implements Rule, Normalizable
{
#[Override]
public static function normalizers(): array
Expand Down
10 changes: 6 additions & 4 deletions src/Constraint/Ip.php → src/Rule/Ip.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,16 @@

declare(strict_types=1);

namespace Norvica\Validation\Constraint;
namespace Norvica\Validation\Rule;

use Norvica\Validation\Normalizing\Normalizable;
use Norvica\Validation\Normalizing\Trim;
use Attribute;
use Norvica\Validation\Normalizer\Normalizable;
use Norvica\Validation\Normalizer\Trim;
use Norvica\Validation\Validation\IpValidation;
use Override;

readonly class Ip implements Validatable, Normalizable
#[Attribute(Attribute::TARGET_PROPERTY)]
readonly class Ip implements Rule, Normalizable
{
public function __construct(
public int|null $version = null,
Expand Down
10 changes: 6 additions & 4 deletions src/Constraint/Number.php → src/Rule/Number.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,16 @@

declare(strict_types=1);

namespace Norvica\Validation\Constraint;
namespace Norvica\Validation\Rule;

use Norvica\Validation\Normalizing\Normalizable;
use Norvica\Validation\Normalizing\Numeric;
use Attribute;
use Norvica\Validation\Normalizer\Normalizable;
use Norvica\Validation\Normalizer\Numeric;
use Norvica\Validation\Validation\NumberValidation;
use Override;

readonly class Number implements Validatable, Normalizable
#[Attribute(Attribute::TARGET_PROPERTY)]
readonly class Number implements Rule, Normalizable
{
public function __construct(
public int|float|null $min = null,
Expand Down
10 changes: 6 additions & 4 deletions src/Constraint/Option.php → src/Rule/Option.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,16 @@

declare(strict_types=1);

namespace Norvica\Validation\Constraint;
namespace Norvica\Validation\Rule;

use Norvica\Validation\Normalizing\Normalizable;
use Norvica\Validation\Normalizing\Trim;
use Attribute;
use Norvica\Validation\Normalizer\Normalizable;
use Norvica\Validation\Normalizer\Trim;
use Norvica\Validation\Validation\OptionValidation;
use Override;

readonly class Option implements Validatable, Normalizable
#[Attribute(Attribute::TARGET_PROPERTY)]
readonly class Option implements Rule, Normalizable
{
/**
* @param string[] $options
Expand Down
8 changes: 5 additions & 3 deletions src/Constraint/Password.php → src/Rule/Password.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@

declare(strict_types=1);

namespace Norvica\Validation\Constraint;
namespace Norvica\Validation\Rule;

use Norvica\Validation\Normalizing\Normalizable;
use Attribute;
use Norvica\Validation\Normalizer\Normalizable;
use Norvica\Validation\Validation\PasswordValidation;
use Override;

readonly class Password implements Validatable, Normalizable
#[Attribute(Attribute::TARGET_PROPERTY)]
readonly class Password implements Rule, Normalizable
{
/**
* @param int $min Minimal password length (default `8`).
Expand Down
4 changes: 2 additions & 2 deletions src/Constraint/Validatable.php → src/Rule/Rule.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

declare(strict_types=1);

namespace Norvica\Validation\Constraint;
namespace Norvica\Validation\Rule;

interface Validatable
interface Rule
{
/**
* @return callable-string
Expand Down
5 changes: 4 additions & 1 deletion src/Constraint/Slug.php → src/Rule/Slug.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,11 @@

declare(strict_types=1);

namespace Norvica\Validation\Constraint;
namespace Norvica\Validation\Rule;

use Attribute;

#[Attribute(Attribute::TARGET_PROPERTY)]
readonly class Slug extends Text
{
public function __construct(
Expand Down
10 changes: 6 additions & 4 deletions src/Constraint/Text.php → src/Rule/Text.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,16 @@

declare(strict_types=1);

namespace Norvica\Validation\Constraint;
namespace Norvica\Validation\Rule;

use Norvica\Validation\Normalizing\Normalizable;
use Norvica\Validation\Normalizing\Trim;
use Attribute;
use Norvica\Validation\Normalizer\Normalizable;
use Norvica\Validation\Normalizer\Trim;
use Norvica\Validation\Validation\TextValidation;
use Override;

readonly class Text implements Validatable, Normalizable
#[Attribute(Attribute::TARGET_PROPERTY)]
readonly class Text implements Rule, Normalizable
{
public function __construct(
public int|null $minLength = null,
Expand Down
12 changes: 7 additions & 5 deletions src/Constraint/Uuid.php → src/Rule/Uuid.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,17 @@

declare(strict_types=1);

namespace Norvica\Validation\Constraint;
namespace Norvica\Validation\Rule;

use Norvica\Validation\Normalizing\Lower;
use Norvica\Validation\Normalizing\Normalizable;
use Norvica\Validation\Normalizing\Trim;
use Attribute;
use Norvica\Validation\Normalizer\Lower;
use Norvica\Validation\Normalizer\Normalizable;
use Norvica\Validation\Normalizer\Trim;
use Norvica\Validation\Validation\UuidValidation;
use Override;

readonly class Uuid implements Validatable, Normalizable
#[Attribute(Attribute::TARGET_PROPERTY)]
readonly class Uuid implements Rule, Normalizable
{
public function __construct(
public int|null $version = null,
Expand Down
10 changes: 5 additions & 5 deletions src/Validation/EmailValidation.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@

namespace Norvica\Validation\Validation;

use Norvica\Validation\Constraint\Email;
use Norvica\Validation\Exception\ConstraintViolation;
use Norvica\Validation\Rule\Email;
use Norvica\Validation\Exception\ValueRuleViolation;

final class EmailValidation
{
Expand All @@ -14,18 +14,18 @@ public function __invoke(string $value, Email $constraint): void
$message = 'Value must be a valid E-mail address';

if (!filter_var($value, FILTER_VALIDATE_EMAIL)) {
throw new ConstraintViolation($message);
throw new ValueRuleViolation($message);
}

[$local, $domain] = explode('@', $value, 2);

if (!preg_match('/^[a-zA-Z0-9.!$%&\'*+\/=?^_`{|}~-]{1,64}$/', $local)) {
throw new ConstraintViolation($message);
throw new ValueRuleViolation($message);
}

// DNS check (A/MX records)
if ($constraint->dns && !checkdnsrr($domain) && !checkdnsrr($domain, 'A')) {
throw new ConstraintViolation($message);
throw new ValueRuleViolation($message);
}
}
}
6 changes: 3 additions & 3 deletions src/Validation/FlagValidation.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@

namespace Norvica\Validation\Validation;

use Norvica\Validation\Constraint\Flag;
use Norvica\Validation\Exception\ConstraintViolation;
use Norvica\Validation\Rule\Flag;
use Norvica\Validation\Exception\ValueRuleViolation;

final class FlagValidation
{
Expand All @@ -14,7 +14,7 @@ public function __invoke(bool $value, Flag $constraint): void
if ($value !== $constraint->value) {
$parameter = $constraint->value ? 'true' : 'false';

throw new ConstraintViolation("Value must be {$parameter}");
throw new ValueRuleViolation("Value must be {$parameter}");
}
}
}
Loading

0 comments on commit 5ace994

Please sign in to comment.