Passed
Push — master ( 2380e5...c08ae0 )
by Bruno
12:55 queued 04:33
created

RequiredWithAll::validate()   B

Complexity

Conditions 7
Paths 13

Size

Total Lines 24
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 13
CRAP Score 7.116

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 7
eloc 14
c 2
b 0
f 0
nc 13
nop 4
dl 0
loc 24
ccs 13
cts 15
cp 0.8667
crap 7.116
rs 8.8333
1
<?php declare(strict_types=1);
2
3
namespace Formularium\Validator;
4
5
use Formularium\Datatype;
6
use Formularium\Exception\ValidatorException;
7
use Formularium\Field;
8
use Formularium\Model;
9
use Formularium\ValidatorInterface;
10
use Formularium\ValidatorMetadata;
11
use Formularium\ValidatorArgs;
12
13
/**
14
 * The field under validation must be present and not empty only if all of the other specified fields are present.
15
 */
16
class RequiredWithAll implements ValidatorInterface
17
{
18 2
    public static function validate($value, array $options = [], Datatype $datatype, ?Model $model = null)
19
    {
20 2
        if (!$model) {
21
            throw new ValidatorException("RequiredWith needs a model");
22
        }
23
24 2
        $expectedFields = $options['fields'];
25 2
        if (!is_array($expectedFields)) {
26
            $expectedFields = [$expectedFields];
27
        }
28 2
        $found = true;
29 2
        $data = $model->getData();
30 2
        foreach ($expectedFields as $ef) {
31 2
            if (!array_key_exists($ef, $data)) {
32 1
                $found = false;
33 1
                break;
34
            }
35
        }
36
37 2
        if ($found && empty($value)) {
38 1
            throw new ValidatorException("Field is required when all fields " . implode(',', $expectedFields) . ' are present');
39
        }
40
41 1
        return $value;
42
    }
43
44 1
    public static function getMetadata(): ValidatorMetadata
45
    {
46 1
        return new ValidatorMetadata(
47 1
            'RequiredWithAll',
48 1
            "The field under validation must be present and not empty only if all of the other specified fields are present.",
49
            [
50 1
                new ValidatorArgs(
51 1
                    'fields',
52 1
                    '[String]',
53 1
                    'The fields that are required with'
54
                )
55
            ]
56
        );
57
    }
58
}
59