Completed
Push — master ( aeb11c...f98da5 )
by Adrian
02:32
created

RequiredWhen::validate()   B

Complexity

Conditions 5
Paths 7

Size

Total Lines 21
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 13
CRAP Score 5

Importance

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