Completed
Push — master ( d45ca1...554243 )
by Adrian
01:42
created

RequiredWhen   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 62
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Test Coverage

Coverage 96.88%

Importance

Changes 0
Metric Value
wmc 14
lcom 1
cbo 2
dl 0
loc 62
ccs 31
cts 32
cp 0.9688
rs 10
c 0
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
B getItemRule() 0 31 9
A validate() 0 20 5
1
<?php
2
declare(strict_types=1);
3
namespace Sirius\Validation\Rule;
4
5
class RequiredWhen extends Required
6
{
7
    const OPTION_ITEM = 'item';
8
    const OPTION_RULE = 'rule';
9
    const OPTION_RULE_OPTIONS = 'rule_options';
10
11
    const MESSAGE = 'This field is required';
12
    const LABELED_MESSAGE = '{label} is required';
13
14 5
    public function getItemRule()
15
    {
16
        /* @var $rule AbstractValidator */
17 5
        $rule        = false;
18 5
        $ruleOptions = (isset($this->options[self::OPTION_RULE_OPTIONS])) ?
19
            (array) $this->options[self::OPTION_RULE_OPTIONS] :
20 5
            [];
21
22 5
        if (is_string($this->options[self::OPTION_RULE])) {
23 3
            $ruleClass = $this->options[self::OPTION_RULE];
24 3
            if (class_exists($ruleClass)) {
25 1
                $rule = new $ruleClass($ruleOptions);
26 2
            } elseif (class_exists('Sirius\\Validation\\Rule\\' . $ruleClass)) {
27 2
                $ruleClass = 'Sirius\\Validation\\Rule\\' . $ruleClass;
28 3
                $rule      = new $ruleClass($ruleOptions);
29
            }
30 2
        } elseif (is_object($this->options[self::OPTION_RULE])
31 2
                  && $this->options[self::OPTION_RULE] instanceof AbstractRule
32
        ) {
33 1
            $rule = $this->options[self::OPTION_RULE];
34
        }
35 5
        if (! $rule) {
36 1
            throw new \InvalidArgumentException(
37 1
                'Validator for the other item is not valid or cannot be constructed based on the data provided'
38
            );
39
        }
40 4
        $context = $this->context ? $this->context : [];
41 4
        $rule->setContext($context);
42
43 4
        return $rule;
44
    }
45
46 6
    public function validate($value, string $valueIdentifier = null)
47
    {
48 6
        $this->value = $value;
49
50 6
        if (! isset($this->options[self::OPTION_ITEM])) {
51 1
            $this->success = true;
52
        } else {
53 5
            $relatedItemPath  = $this->getRelatedValueIdentifier($valueIdentifier, $this->options[self::OPTION_ITEM]);
54 5
            $relatedItemValue = $relatedItemPath !== null ? $this->context->getItemValue($relatedItemPath) : null;
55
56 5
            $itemRule = $this->getItemRule();
57 4
            if ($itemRule->validate($relatedItemValue, $relatedItemPath)) {
58 2
                $this->success = ($value !== null && trim($value) !== '');
59
            } else {
60 2
                $this->success = true;
61
            }
62
        }
63
64 5
        return $this->success;
65
    }
66
}
67