respect-validation/library/Rules/Key.php
Henrique Moody 8573bc5d45
Do not overwrite "IDs" when updating names
When you have a chain of rules in the Validation and overwrite the name
with "setName()," it's impossible to get the messages from all rules in
the chain as an array because they all have the same name.

These changes will change that behavior by creating a more explicit
distinction between "IDs" and "names." The "IDs" will remain
unchangeable, while we can always overwrite the names. That means that
the array messages will look more similar to the chain, and it will be
possible to overwrite the messages from multiple rules in the same
chain.

Signed-off-by: Henrique Moody <henriquemoody@gmail.com>
2024-03-26 01:12:44 +01:00

51 lines
1.2 KiB
PHP

<?php
/*
* Copyright (c) Alexandre Gomes Gaigalas <alganet@gmail.com>
* SPDX-License-Identifier: MIT
*/
declare(strict_types=1);
namespace Respect\Validation\Rules;
use Respect\Validation\Helpers\CanBindEvaluateRule;
use Respect\Validation\Result;
use Respect\Validation\Rules\Core\Wrapper;
use Respect\Validation\Validatable;
final class Key extends Wrapper
{
use CanBindEvaluateRule;
public function __construct(
private readonly int|string $key,
Validatable $rule,
) {
$rule->setName($rule->getName() ?? (string) $key);
parent::__construct($rule);
}
public function getKey(): int|string
{
return $this->key;
}
public function evaluate(mixed $input): Result
{
$keyExistsResult = $this->bindEvaluate(new KeyExists($this->key), $this, $input);
if (!$keyExistsResult->isValid) {
return $keyExistsResult;
}
$child = $this->rule
->evaluate($input[$this->key])
->withId((string) $this->key);
return (new Result($child->isValid, $input, $this))
->withChildren($child)
->withId((string) $this->key)
->withNameIfMissing($this->rule->getName() ?? (string) $this->key);
}
}