-
Notifications
You must be signed in to change notification settings - Fork 29
Expand file tree
/
Copy pathRequiredWhen.php
More file actions
66 lines (56 loc) · 2.37 KB
/
RequiredWhen.php
File metadata and controls
66 lines (56 loc) · 2.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?php
declare(strict_types=1);
namespace Sirius\Validation\Rule;
class RequiredWhen extends Required
{
const OPTION_ITEM = 'item';
const OPTION_RULE = 'rule';
const OPTION_RULE_OPTIONS = 'rule_options';
const MESSAGE = 'This field is required';
const LABELED_MESSAGE = '{label} is required';
public function getItemRule(): ?AbstractRule
{
$rule = false;
$ruleOptions = (isset($this->options[self::OPTION_RULE_OPTIONS])) ?
(array)$this->options[self::OPTION_RULE_OPTIONS] :
[];
if (is_string($this->options[self::OPTION_RULE])) {
$ruleClass = $this->options[self::OPTION_RULE];
if (class_exists($ruleClass)) {
$rule = new $ruleClass($ruleOptions);
} elseif (class_exists('Sirius\\Validation\\Rule\\' . $ruleClass)) {
$ruleClass = 'Sirius\\Validation\\Rule\\' . $ruleClass;
$rule = new $ruleClass($ruleOptions);
}
} elseif (is_object($this->options[self::OPTION_RULE])
&& $this->options[self::OPTION_RULE] instanceof AbstractRule
) {
$rule = $this->options[self::OPTION_RULE];
}
if (!$rule) {
throw new \InvalidArgumentException(
'Validator for the other item is not valid or cannot be constructed based on the data provided'
);
}
/* @var $rule AbstractRule */
$rule->setContext($this->context ?? []); // @phpstan-ignore-line
return $rule; // @phpstan-ignore-line
}
public function validate(mixed $value, ?string $valueIdentifier = null): bool
{
$this->value = $value;
if (!isset($this->options[self::OPTION_ITEM])) {
$this->success = true;
} else {
$relatedItemPath = $this->getRelatedValueIdentifier((string)$valueIdentifier, $this->options[self::OPTION_ITEM]);
$relatedItemValue = $this->context && $relatedItemPath !== null ? $this->context->getItemValue($relatedItemPath) : null;
$itemRule = $this->getItemRule();
if ($itemRule && $itemRule->validate($relatedItemValue, $relatedItemPath)) {
$this->success = ($value !== null && (!is_string($value) || trim($value) !== ''));
} else {
$this->success = true;
}
}
return $this->success;
}
}