KeyValue

  • keyValue(string $comparedKey, string $ruleName, string $baseKey)

Performs validation of $comparedKey using the rule named on $ruleName with $baseKey as base.

Sometimes, when validating arrays, the validation of a key value depends on another key value and that may cause some ugly code since you need the input before the validation, making some checking manually:

v::key('password', v::notEmpty())->validate($_POST);
v::key('password_confirmation', v::equals($_POST['password'] ?? null))->validate($_POST);

The problem with the above code is because you do not know if password is a valid key, so you must check it manually before performing the validation on password_confirmation.

The keyValue() rule makes this job easier by creating a rule named on $ruleName passing $baseKey as the first argument of this rule, see an example:

v::keyValue('password_confirmation', 'equals', 'password')->validate($_POST);

The above code will result on true if $_POST['password_confirmation'] is equals to $_POST['password'], it's the same of:

See another example:

v::keyValue('state', 'subdivisionCode', 'country')->validate($_POST);

The above code will result on true if $_POST['state'] is a subdivision code of $_POST['country']:

This rule will invalidate the input if $comparedKey or $baseKey don't exist, or if the rule named on $ruleName could not be created (or don't exist).

When using assert() or check() methods and the rule do not pass, it overwrites all values in the validation exceptions with $baseKey and $comparedKey.

try {
    v::keyValue('password_confirmation', 'equals', 'password')->check($_POST);
} catch (ValidationException $exception) {
    // ..
}

The above code may generate the message:

password_confirmation must equal "password"

Categorization

  • Arrays
  • Nesting

Changelog

Version Description
1.0.0 Created

See also: